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
'programing' 카테고리의 다른 글
Firebase 데이터베이스에서 데이터를 검색하는 방법은 무엇입니까? (0) | 2023.07.14 |
---|---|
Xcode에 개발팀이 표시되지 않습니다. (0) | 2023.07.14 |
MongoDB 중첩 배열 쿼리 (0) | 2023.07.14 |
Linux 프레임 버퍼를 통해 화면에 픽셀 그리기 (0) | 2023.07.14 |
각도 라우팅이란 무엇입니까? (0) | 2023.07.14 |