strtok, strtok_r

programming/C_C++ 2017. 11. 3. 19:23
반응형

 

 


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]

 

반응형
Posted by 공간사랑
,