sscanf
작품 :버퍼 대신 입력 문자열에 대한 포인터가있는 sscanf의 변형이 있습니까? 이 같은
int main(const int argc, const char *argv[]) {
char buf1[1024] = {0};
char buf2[1024] = {0};
char buf3[1024] = {0};
char *str = "abc, 123; xyz";
sscanf(str, "%[^,], %[^;]; %s", buf1, buf2, buf3);
printf("'%s' '%s' '%s'", buf1, buf2, buf3); // Prints: "'abc' '123' 'xyz'"
return 0;
}
버퍼 (buf1, buf2, buf3
)에 str
의 내용을 복사하거나 새로운 메모리를 할당 필요로하지 않는 함수가 있는지 궁금 해요. 대신 포인터 (ptr1, ptr2, ptr3
)를 str
의 일치하는 부분을 가리 키도록 설정하고 null은 일치 이후에 오는 것을 종료합니다.
int main(const int argc, const char *argv[]) {
char *ptr1 = NULL;
char *ptr2 = NULL;
char *ptr3 = NULL;
char *str = "abc, 123; xyz";
//
// str = "abc, 123; xyz\0"
//
_sscanf(str, "%[^,], %[^;]; %s", &ptr1, &ptr2, &ptr3);
//
// str = "abc\0 123\0 xyz\0"
// ^ ^ ^
// ptr1 ptr2 ptr3
//
printf("'%s' '%s' '%s'", ptr1, ptr2, ptr3); // Prints: "'abc' '123' 'xyz'"
return 0;
}
나는 strtok_r
등의 기능과 사용 될 수있는 regex.h
라이브러리가 알고 있지만, 나는이 입력 문자열을 수정할 수 있습니다 경우에 더 편리 할 것이라고 생각합니다.
이 문제가 sscanf''에 의해 구문 분석 입력이 * 항상 * 널 (null)로 종료 할 수없는 것을! 'regex.h'는 서브 그룹 매치의 * 범위 *를 반환합니다 - 그것은 할 수 있습니다. –
귀하의 질문에 말도 안되는 중간에 어딘가에 원래의 문자열을 종료하는 경우, 당신은 str의 크기가 맞다면 나머지를 이동하더라도 당신이 뭔가 BTW를 덮어 씁니다 결코 더 이상 같은 문자열 str되지 않습니다 증가하고 가장 재할당하는 재 할당이 필요할 것입니다. –
일부 경우에 제가 말했습니다. 어떤 경우에는 입력 문자열이 수정되는지는 상관하지 않습니다. –