도움받은 사이트 :

 - 행복한 코딩세상 (http://downman.tistory.com/231)

 - Stack OverFlow (https://stackoverflow.com/questions/8512958/is-there-a-windows-variant-of-strsep)

 

 

아래와 같이 콤마로 구분되어있는 문자열은 strtok() 함수를 사용하여 쉽게 문자열을 구분할 수 있다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <cstdio>
#include <cstring>
 
int main()
{
        char szText[256] ;
        char *pSep ;
 
        strcpy(szText, "name,age,address") ;
 
        pSep = strtok(szText, ",") ;
        printf("1 : %s\n", pSep) ;
 
        pSep = strtok(NULL, ",") ;
        printf("2 : %s\n", pSep) ;
 
        pSep = strtok(NULL, ",") ;
        printf("3 : %s\n", pSep) ;
 
        return 1 ;
}

 

만약 아래와 같이 내용없는 토큰이 연달아 나타난다면,

"name,age,,,,address"

안타깝게도 strtok 는 내용없는 부분을 그냥 무시해버린다.

 

무시하지 않도록 하기 위해 strsep() 함수를 쓸 수 있다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <cstdio>
#include <cstring>
 
int main()
{
        char szText[256] ;
        char *pSep ;
        char *pText;
 
        strcpy(szText, "name,age,,,,address") ;
 
        pText = szText ;
        pSep = strsep(&pText, ",") ;
        printf("pSep : %s\n", pSep) ;
 
        pSep = strsep(&pText, ",") ;
        printf("pSep : %s\n", pSep) ;
 
        pSep = strsep(&pText, ",") ;
        pSep = strsep(&pText, ",") ;
        pSep = strsep(&pText, ",") ;
 
        pSep = strsep(&pText, ",") ;
        printf("pSep : %s\n", pSep) ;
 
        return 1 ;
}

내용없는 token 을 skip 하기 위해 strsep 함수를 그냥 세번 호출한 부분을 볼 수 있다.

 

문제는 이 함수는 Linux 에서 제공을 하기때문에 Visual C++ 개발환경에선 strsep() 함수를 제공하지 않는다.

 

이에 아래와 같이 strsep 함수를 직접 만들어 쓰면 된다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
char* mystrsep(char** stringp, const char* delim)
{
        char* start = *stringp;
        char* p;
 
        p = (start != NULL) ? strpbrk(start, delim) : NULL;
 
        if (p == NULL)
        {
                *stringp = NULL;
        }
        else
        {
                *p = '\0';
                *stringp = p + 1;
        }
 
        return start;
}

 

+ Recent posts