strtok에 NULL을 전달하는 이유
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);