Computer/etc.

strtok_r : 문자열에서 토큰 뽑아냄.

수지밝은미소 2007. 7. 10. 17:59

[발췌: 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;
}