strtok, strtok_r
이름
strtok, strtok_r - 문자열에서 토큰들을 뽑아낸다.
사용법
#include <string.h>
char *strtok(char *s, const char *delim);
char *strtok_r(char *s, const char *delim, char **ptrptr);
설명
‘토큰‘이란 문자열 delim에 속하지 않는 문자들로 이루어진 비어 있지 않은 문자열이며 \0이나 delim에 있는 문자가 뒤따른다.
strtok() 함수는 문자열 s를 토큰으로 파싱하기 위해 사용된다. strtok()의 첫번째 인자로 s를 주면, 가장 앞에 있 는
토큰을 구하고, 그 문자열안의 다음 토큰을 구하고자 할 때에는 첫번째 인자를 NULL로 설정하여야 한다. 각 호출은 다
음 토큰에 대한 포인터를 반환하거나 더이상 토큰이 발견되지 않는다면 NULL을 반환한다.
토큰이 구분자로 끝난다면, 이 구분자는 \0로 겹쳐 쓰여지며 다음 문자에 대한포인터가 strtok()에 대한 다음 호출을
위해 저장된다. 구분 문자열 delim는 각 호출시 다를수 있다.
strtok_r() 함수는 strtok() 와 동일하게 작동한다. 그러나 정적 버퍼를 사용하는 대신에이 함수는 char * 포인터로 할
당된 유저에 대한 포인터를 사용한다. 이 포인터, ptrptr 파라미터는 같은 문자열을 파싱하는 동안 같아야만 한다.
버그
이 함수를 사용해서는 안된다. 만일 사용해야 한다면, 다음을 주의하라:
이 함수는 처음 인자를 수정한다. 구분자의 원본은 잃게 된다. 이 함수는 상수 문자열에서는 사용해서는 안된다.
strtok () 함수는 파싱하는 동안 정적버퍼를 사용한다. 그래서 thread safe가 아니다. 만일 이것이 문제라면 strtok_r () 를 사용해라.
반환값
strtok() 함수는 다음 토큰에 대한 포인터를 반환하거나 만일 더 이상토큰이 없다면 NULL을 반환한다.
예시)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
char buffer[1024];
char *ptr = NULL;
char *pNext = NULL;
memset(buffer, 0x00, sizeof(buffer));
sprintf(buffer, "ABC:1234567890\nABCDEFG");
ptr = strtok_r(buffer, ":", &pNext);
fprintf(stdout, "ptr=[%s] pNext=[%s]\n", ptr, pNext);
return 1;
}
결과)
$ a.out
ptr=[ABC] pNext=[1234567890
ABCDEFG]