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 = []
'C언어 header > string.h' 카테고리의 다른 글
strerror_r(3) - 오류번호를 오류 메세지로 (0) | 2019.09.25 |
---|---|
strerror(3) - 오류번호를 오류 메세지로 (0) | 2019.09.25 |
strtok_r(3) - 문자열을 delimiter 단위로 자르기 (thread-safe) (0) | 2019.09.25 |
strtok(3) - 문자열을 delimiter 단위로 자르기 (0) | 2019.09.25 |
strrstr(3) - 문자열의 뒤에서 부터 문자열 찾기(비표준) (2) | 2019.09.25 |