programing

sscanf가 있는 공백이 있는 문자열 읽기

javamemo 2023. 7. 14. 23:22
반응형

sscanf가 있는 공백이 있는 문자열 읽기

프로젝트를 위해 저는 문자열에서 int와 string을 읽으려고 합니다.유일한 문제는sscanf()읽는 것을 방해하는 것처럼 보입니다.%s그것이 공간을 볼 때.이 한계를 극복할 방법이 있습니까?다음은 제가 하려는 일의 예입니다.

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char** argv) {
    int age;
    char* buffer;
    buffer = malloc(200 * sizeof(char));
    sscanf("19 cool kid", "%d %s", &age, buffer);

    printf("%s is %d years old\n", buffer, age);
    return 0;
}

인쇄 대상:cool is 19 years old내가 필요한 곳에cool kid is 19 years old이거 어떻게 고치는지 아는 사람?

다음 줄은 숫자를 읽기 시작합니다.%d탭 또는 새 줄과 다른 항목이 표시됩니다.%[^\t\n]).

sscanf("19 cool kid", "%d %[^\t\n]", &age, buffer);

당신은 그것을 원합니다.%c변환 지정자: 공백에 대한 특별한 처리 없이 일련의 문자만 읽습니다.

먼저 버퍼를 0으로 채워야 합니다. 왜냐하면%c지정자가 null-terminator를 쓰지 않습니다.또한 읽을 문자 수를 지정해야 합니다(그렇지 않으면 기본값은 1만).

memset(buffer, 0, 200);
sscanf("19 cool kid", "%d %199c", &age, buffer);

문자열 끝까지 스캔하려면(새 줄이 있는 경우 제거) 다음을 사용합니다.

char *x = "19 cool kid";
sscanf (x, "%d %[^\n]", &age, buffer);

그것은%s공백이 아닌 문자만 일치하며 처음 찾은 공백에서 멈춥니다.%[^\n]형식 지정자는 (때문에) 그렇지 않은 모든 문자와 일치합니다.^)를 선택합니다(새 줄).즉, 다른 문자와 일치합니다.


읽을 수 있는 양을 확신할 수 없기 때문에 버퍼에 문자열을 가져올 충분한 공간을 할당해야 합니다(멀리 떨어져 있어야 하는 좋은 이유).scanf/fscanf특정 필드 너비를 사용하지 않는 한).

다음과 같은 기능을 사용할 수:

char *x = "19 cool kid";
char *buffer = malloc (strlen (x) + 1);
sscanf (x, "%d %[^\n]", &age, buffer);

(필요 없음)* sizeof(char)정의상 항상 1이기 때문에).

입력에서 후행 문자열을 원하기 때문에 다음을 사용할 수 있습니다.%n(지금까지 사용된 문자 수) - 후행 문자열이 시작되는 위치를 가져옵니다.이렇게 하면 메모리 복사본 및 버퍼 크기 조정 문제를 피할 수 있지만 복사본을 원할 경우 명시적으로 수행해야 할 수도 있습니다.

const char *input = "19  cool kid";
int age;
int nameStart = 0;
sscanf(input, "%d %n", &age, &nameStart);
printf("%s is %d years old\n", input + nameStart, age);

출력:

cool kid is 19 years old

이것이 당신이 원하는 것이라고 생각합니다, 당신이 지정한 것과 정확히 일치합니다.

#include<stdio.h>
#include<stdlib.h>

int main(int argc, char** argv) {
    int age;
    char* buffer;
    buffer = malloc(200 * sizeof(char));
    sscanf("19 cool kid", "%d cool %s", &age, buffer);
    printf("cool %s is %d years old\n", buffer, age);
    return 0;
}

형식은 먼저 숫자(및 &age가 가리키는 위치에 배치), 공백(0 이상), 리터럴 문자열 "cool", 공백(0 이상), 마지막으로 문자열(버퍼가 가리키는 위치에 배치)을 예상합니다.포맷 문자열에서 "냉각" 부분을 잊어버렸기 때문에 포맷은 버퍼에 할당하려는 문자열로 가정합니다.하지만 당신은 그 문자열을 할당하고 싶지 않고 그냥 건너뛰기만 하면 됩니다.

또는 "%d %s %s"와 같은 형식 문자열을 사용할 수도 있지만, 다른 이름으로 다른 버퍼를 할당하고 "%s %s is %d years\n"로 인쇄해야 합니다.

언급URL : https://stackoverflow.com/questions/2854488/reading-a-string-with-spaces-with-sscanf

반응형