반응형

strsep(3)

#include <string.h>

char *strsep(char **stringp, const char *delim);

strsep(3)함수는 delim 문자열에 포함된 문자들 중에서 하나라도 만나면, 그 문자열 단위로 문자열을 분리합니다.

이 함수는 strtok(3)함수와 기능은 비슷하지만, 차이점은 strsep(3)함수는 delimiter가 연속으로 오거나 시작과 끝문자가 delimiter문자이면 빈문자열을 return하고, strtok(3)함수는 skip됩니다. *stringp의 값이 ",12,34,,5,"이고 delim이 ","이면 strsep(3)은 "", "12", "34", "", "5", ""로 6개의 문자열로 분리되어 순서대로 return합니다. strtok(3)은 "12","34","5"로 3개의 문자열로 분리되어 순서대로 return합니다.

 

이 함수는 strtok(3)함수와는 달리 thread-safe한 함수입니다.

 

※주의: 이 함수는 BSD계열의 UNIX나 LINUX에서만 지원합니다.

표준라이브러리로 strsep(3)을 지원하지 않는다면 아래의 strsep()구현된 소스를 할용바랍니다.

 

※주의: 이 함수는 *stringp 문자열의 원본 데이터를 손상시키므로 원본 보존이 필요하면 복사본을 사용하여야 합니다.

 

※주의: *stringp의 pointer 위치를 변경시키므로 *stringp변수에 malloc(3)등으로 메모리를 할당하였다면, 시작 위치를 가지고 있을 pointer변수를 추가로 사용해야 합니다.

 

 

파라미터

stringp
    - 문자열을 delimiter 단위로 분리할 문자열
    - 이 문자열 pointer는 한번 호출될 때마다 문자열 pointer의 위치가 변경됩니다.
    - NULL이면 NULL을 return 합니다.
delim
    - 문자열을 분리할 delimiter 문자들.
    - 이 문자열에 포함된 문자중에서 하나라도 일치하면 문자열 분리가 됩니다.

 

RETURN

NULL 아님
    - delimiter 단위로 분리된 하나의 문자열.
    
NULL
    - 더 이상 분리할 문자열이 없습니다.

 


활용 예제

 

구현소스). strsep(3)를 표준라이브러리로 제공되지 않는 경우

#include <string.h>

char *strsep(char **stringp, const char *delim)
{
    char *ptr = *stringp;

    if(ptr == NULL) {
        return NULL;
    }

    while(**stringp) {
        if(strchr(delim, **stringp) != NULL) {
            **stringp = 0x00;
            (*stringp)++;
            return ptr;
        }
        (*stringp)++;
    }
    *stringp = NULL;

    return ptr;
}

 

Sample). 배열을 사용하는 경우

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

int main(int argc, char **argv)
{
    char orginal[1024] = ",12,34,,5,";
    char temp_string[1025];
    char *tmp;
    char *ptr = NULL;

    /* 원본 보존을 위하여 복사본을 사용함 */
    strcpy(temp_string, orginal);

    /* strsep(3)함수는 pointer의 위치가 변경되어야 하므로 
      배열을 직접사용할 수 없으며, pointer를 사용해야 함 
    */
    tmp = temp_string;

    while((ptr = strsep(&tmp, ",")) != NULL) {
        printf("ptr = [%s]\n", ptr);
    }

    return 0;
}

결과:
ptr = []
ptr = [12]
ptr = [34]
ptr = []
ptr = [5]
ptr = []

 

Sample). malloc된 문자열을 사용하는 경우

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

int main(int argc, char **argv)
{
    char orginal[1024] = ",12,34,,5,";
    char *temp_string;
    char *tmp;
    char *ptr = NULL;

    /* 원본 보존을 위하여 복사본을 사용함. 
       strdup()은 내부적으로 malloc()을 사용함 
    */
    temp_string = strdup(orginal);

    /* strsep(3)함수는 pointer의 위치가 변경되어야 하므로 
      배열을 직접사용할 수 없으며, pointer를 사용해야 함 
    */
    tmp = temp_string;

    while((ptr = strsep(&tmp, ",")) != NULL) {
        printf("ptr = [%s]\n", ptr);
    }

    free(temp_string);

    return 0;
}


결과:
ptr = []
ptr = [12]
ptr = [34]
ptr = []
ptr = [5]
ptr = []

 

반응형
블로그 이미지

자연&사람

행복한 개발자 programmer since 1995.

,