2017-10-21 9 views
0

의 내가 매개 변수 - 값 쌍을 가진 C 문자열 ch 있다고 가정 해 봅시다 :문자열 내의 C 문자열 포인터가 null로 종료되는 방법은 무엇입니까?

#include <string.h> 
char ch[] = "name=John sex=male age=30"; // null-terminated C string 
char *p, *v; // pointers to parameter and value 

p = strstr(ch, "sex="); // p now points to "sex=male age=30" 
sscanf(p, "sex=%s", v); // get the value for sex 
printf("sex = %s\n", v); // gives "male", works as expected 
printf("length of v is %i\n", strlen(v)); // gives 4 
printf("is v null-terminated? %i\n", (*(v+4)=='\0')); // gives 1 

나의 이해는 pch에서 "섹스 = M 나이 = 30",에가와 ch 같은 null 종결을 사용한다는 것입니다. vp에서 "male"을 가리키고 은 내 질문에 v의 널 종결자를 저장합니다? pch에서 "male"다음에 공백이 있으며 여기에서 v은 버퍼가 아니라 포인터입니다.

+0

이제 'char * v'보다는'char v [5]'와 같은 것을해야한다는 것을 이해합니다. 'sscanf' 다음에'ch'를 출력 할 때 충돌이 발생합니다. 인쇄하지 않고, 나를 위해 일한 생각 :) –

답변

2

제 질문은 v에 대한 널 종결자가 어디에 저장되어 있습니까?

없습니다. v이 초기화되지 않았기 때문에 undefined behaviour을 호출하고 있습니다. null 종결 자뿐 아니라 sscanf()가 v이 가리키는 위치에 "male"을 쓰는 것은 유효하지 않습니다. v은 유효한 메모리 위치를 가리 키지 않으므로

sscanf()은 null 종료를 수행하지만 올바른 포인터 (예 : char v[5])를 전달해야합니다. sscanf()은 첫 번째 인수를 전혀 수정하지 않습니다. 따라서 chsscanf()으로 수정되지 않습니다.

+0

대답 주셔서 감사합니다. 지금은'sscanf'를 잘못 사용하고 있다는 것을 이해합니다. 그러나 @mark Tolenen이 주석을 달았을 때'sscanf' 다음에'ch'를 출력 할 때, 그것은 추락했습니다. 어떻게 될까요? 당신이 말했듯이'sscanf'는 첫 번째 인수를 수정하지 않습니다. –

+0

아마도 * 정의되지 않은 동작 * 때문일 수 있습니다. 초기화되지 않은'v'에 기록하면 어딘가에서 쓸 수 있습니다. 'char v [5];를 사용하더라도 그것은 발생합니까? – usr

+0

일단'char v [5]'로 변경하면 아무런 문제가 없습니다. 고맙습니다. –