C에서 strsep 함수 사용
이 기사에서는 C에서strsep
함수를 사용하는 방법에 대한 여러 가지 방법을 보여줍니다.
strsep
함수를 사용하여 문자열에서 주어진 토큰 찾기
strsep
는<string.h>
헤더 파일에 정의 된 C 표준 라이브러리 문자열 유틸리티의 일부입니다. 문자열 개체에서 지정된 구분 문자로 둘러싸인 토큰을 추출하는 데 사용할 수 있습니다.
strsep
는char *
에 대한 포인터와char
에 대한 포인터라는 두 개의 인수를 사용합니다. 첫 번째 인수는 검색해야하는 문자열의 주소를 전달하는 데 사용됩니다. 두 번째 매개 변수는 추출 된 토큰의 시작과 끝을 표시하는 분리 문자 세트를 지정합니다. 분리 문자는 추출 된 토큰 문자열에서 삭제됩니다. 첫 번째 토큰이 발견되면 발견 된 다음 구분 기호에 대한 포인터를 저장하도록 첫 번째 인수가 수정됩니다.
다음 예에서는strsep
에 대한 단일 호출을 사용하여 주어진 문자로 구분 된 두 개의 토큰을 추출하는 방법을 보여줍니다. 프로그램은 2 개의 명령 줄 인수에서 설정된 문자열과 구분 기호를 가져오고 필요에 따라 제공되지 않으면 실패와 함께 종료됩니다. 다음으로,strsep
가 전달 된 포인터를 수정하므로strdupa
함수 호출로 문자열을 복제하고 원래 값을 잃고 싶지 않습니다. strdupa
는 스택에 동적 메모리를 할당하며 호출자는 여기에서 반환 된 포인터를 해제해서는 안됩니다.
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[]) {
char *str1, *token;
if (argc != 3) {
fprintf(stderr, "Usage: %s string delim\n", argv[0]);
exit(EXIT_FAILURE);
}
str1 = strdupa(argv[1]);
if (!str1) exit(EXIT_FAILURE);
token = strsep(&str1, argv[2]);
if (token == NULL) exit(EXIT_FAILURE);
printf("extracted: '%s'\n", token);
printf("left: '%s'\n", str1);
exit(EXIT_SUCCESS);
}
샘플 명령:
./program "hello there" t
출력:
extracted: 'hello '
left: 'here'
대안으로,strsep
함수를 연속적으로 호출하는for
루프를 구현할 수 있으며, 이전 예제 코드에서 볼 수 있듯이 첫 번째로 만난 것만이 아닌 지정된 구분 기호로 모든 토큰을 추출 할 수 있습니다. 그러나strsep
는 두 개의 구분 문자가 한 행에있을 때 빈 문자열을 반환합니다. 따라서 호출자는 결과 토큰을 처리하기 전에이를 확인해야합니다. 이 페이지에 자세히 설명 된strtok
및strtok_r
라이브러리 함수를 사용하여 약간의 차이가있는 유사한 기능도 제공됩니다.
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[]) {
char *str1, *token;
if (argc != 3) {
fprintf(stderr, "Usage: %s string delim\n", argv[0]);
exit(EXIT_FAILURE);
}
str1 = strdupa(argv[1]);
if (!str1) exit(EXIT_FAILURE);
for (int j = 1;; j++) {
token = strsep(&str1, argv[2]);
if (token == NULL) break;
printf("%d: '%s'\n", j, token);
}
exit(EXIT_SUCCESS);
}
샘플 명령:
./program "hello there" tl
출력:
1: 'he'
2: ''
3: 'o '
4: 'here'
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook