도움받은 사이트 :
- 행복한 코딩세상 (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;
} |
'삽질미학 > C,C++' 카테고리의 다른 글
2차원 벡터를 포인터로 넘겨 사용하기 (0) | 2024.02.13 |
---|---|
Windows API에서 UTF-8, ANSI(CP949), Unicode 간 변환 개념잡기 (0) | 2021.01.28 |
[C++] 삼각형 구조의 하향식 길찾기 (0) | 2017.07.18 |
[C++] 조합 구하기 (0) | 2017.07.13 |
[C++] 순열 구하기 (0) | 2017.07.12 |