strtok_r : 문자열에서 토큰 뽑아냄.
[발췌: linux man page]
strtok, strtok_r - 문자열에서 토큰들을 뽑아낸다.
사용법
#include
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을 반환한다.
호환
strtok()
SVID 3, POSIX, BSD 4.3, ISO 9899
strtok_r()
POSIX.1c
관련 항목
index(3), memchr(3), rindex(3), strchr(3), strpbrk(3), strsep(3), strspn(3),
strstr(3)
구현
[발췌: devpia.com]
------------------------------------------------------------------------------
char* strtok(register char *string, const char *separators)
{
register char *s1, *s2;
static char *savestring;
if (string == NULL) {
string = savestring;
if (string == NULL) return (char *)NULL;
}
s1 = string + strspn(string, separators);
if (*s1 == ' ') {
savestring = NULL;
return (char *)NULL;
}
s2 = strpbrk(s1, separators);
if (s2 != NULL)
*s2++ = ' '
savestring = s2;
return s1;
}
char* strtok_r(char *s1, const char *s2, char **lasts)
{
char *ret;
if (s1 == NULL)
s1 = *lasts;
while(*s1 && strchr(s2, *s1))
++s1;
if(*s1 == ' ')
return NULL;
ret = s1;
while(*s1 && !strchr(s2, *s1))
++s1;
if(*s1)
*s1++ = ' '
*lasts = s1;
return ret;
}