strtok를 쓸 때, 왜 두번째 콜에서 NULL을 넘겨줄까? 그냥 그러려다 찾아보았다.
char str[] = "Hello World. How are you?";
char delim[] = " ";
char *ptr;
ptr = strtok(str, delim);
printf("%s\n", ptr);
while(ptr = strtok(NULL, delim))
printf("%s\n", ptr);
다음은 strtok.c 의 내용이다.(glibc 2.19버전)
41라인을 보면 NULL일 경우, static 변수 old로 대체한다. 아! 그래서 NULL을 써서 이어서 파싱이 되게 하는구나. 그리고 static변수라... 쓰레드 사용시에 문제가 있을 거 같다.
추가로 찾아본 내용을 보니,(http://ogoons.tistory.com/m/post/70) 다음과 같은 주의사항이 있다.
1. strtok()의 사용 후, 원본 문자열의 데이터를 보장할 수 없다.
2. visual studio 상위 버전에 문제가 있을 수 있다.
3. strtok()은 내부적으로 문자열 분리를 위해 static변수를 놓고 정적공유를 함으로 , thread-safe하지 않다.(음 역시)
따라서 위의 상황들을 개선한 strtok_s()를 쓰길 권장한다고 한다.
char str[] = "Hello World Good, Morning Sunshine";
char delim[] = " ,";
char *ptr;
char *context = NULL;
ptr = strtok_s(str, delim, &context);
printf("%s\n", ptr);
while(ptr = strtok_s(NULL, delim, &context))
printf("%s\n", ptr);
'프로그래밍 > C' 카테고리의 다른 글
strerror 사용법, perror 사용법 (0) | 2014.06.02 |
---|---|
malloc 를 캐스팅 하지 말자. (0) | 2014.05.29 |
함수포인터 & typdef를 이용한 함수포인터 (0) | 2014.05.07 |
ternary operator (0) | 2014.04.13 |
[visual studio] 에러 C2143 로컬변수 선언 위치 (0) | 2013.11.24 |