strtok_r(3)

#include <string.h>

char *strtok_r(char *str, const char *delim, char **saveptr);

strtok(3)은 str문자열을 delim에 포함된 문자들 중에서 하나를 만나는 곳을 null-terminated 문자열로 변경하여 return합니다. str문자열이 NULL이면 그 다음 delimiter까지의 문자열을 return합니다. saveptr은 문자열을 strtok(3)의 내부에서 관리하던 static 변수 대신에 외부 변수를 사용하도록 변경하여 multi-thread에 안전하도록 변경되었습니다.

 

strtok(3)은 multi-thread 프로그램에서 오류를 유발할 수 있으므로, 이 strtok_r(3)함수를 사용하는 것이 좋습니다.

 

※주의: delimiter가 연속으로 있는 경우에는 delimiter와 delimiter 사이의 값인 ""가 return되지 않습니다.

delimter로 시작하거나 delimiter로 끝나는 경우에도 ""를 return하지 않습니다.

예를들면, Comma(,)로 분리된 데이터를 에서 a,,b,c의 경우 "a", "", "b", "c"로 분리되지 않고 "a", "b","c"로 분리됩니다.

 

※주의: strtok_r(3)함수는 파라미터 type(const가 빠짐)을 보면 알 수 있듯이

원본 문자열인 str 문자열의 값이 변경되므로 strtok_r(3)함수를 실행하기전에

원본 훼손이 되면 안되는 경우에는 다른 변수에 복제하여 본제된 문자열을 사용하여야 합니다.

 

 

파라미터

str
    - delimiter단위로 분리할 문자열.
    - NULL이면 saveptr 변수에서 저장하고 있던 이전에 호출한 위치 다음부터 분리작업을 진행합니다.

  ※주의 : str문자열은 변경이 일어나기 때문에 원본 문자열을 보존하려면 
          임시변수에 복사한 후 임시변수를 사용하기 바랍니다.
delim
    - 문자열을 분리할 delimiter 문자들. delim에 포함된 아무 문자라도 만나면 분리함.
saveptr
    - 다음처리를 위한 위치를 저장하는 pointer
    - 이 변수는 직접 handling하지 않습니다

 

RETURN

NULL 아님
    - 정상적으로 delimiter로 분리하였으며, 분리된 문자열의 시작 pointer를 return합니다.
    
NULL
    - 분리할 데이터가 더 이상없습니다.

 


활용 예제

 

#include <string.h>
#include <stdio.h>

/* /또는 - 또는 : 또는 space를 delimiter로 사용합니다. */

#define DELIM_CHARS     "/-: "

int main(int argc, char **argv)
{
    char time[1024] = "2017-02-12 10:25:30";
    char *ret_ptr;
    char *next_ptr;

    printf("time : [%s]\n", time);

    ret_ptr = strtok_r(time, DELIM_CHARS, &next_ptr);

    while(ret_ptr) {
        printf("ret_ptr = [%s]\n", ret_ptr);

        ret_ptr = strtok_r(NULL, DELIM_CHARS, &next_ptr);
    }

    return 0;
}

결과:
time : [2017-02-12 10:25:30]
ret_ptr = [2017]
ret_ptr = [02]
ret_ptr = [12]
ret_ptr = [10]
ret_ptr = [25]
ret_ptr = [30]

 

블로그 이미지

사용자 자연&사람

행복한 개발자 programmer since 1995.

댓글을 달아 주세요