728x90
반응형
C 언어에서 문자열을 다룰 때, 문자열을 분할하거나 복제해야 하는 경우가 자주 발생합니다. 이러한 작업을 효율적으로 수행할 수 있도록 표준 라이브러리 <string.h>
에서는 strtok
과 strdup
함수를 제공합니다.
이번 포스팅에서는 strtok
을 이용한 문자열 토큰화(Tokenization)와 strdup
을 이용한 문자열 복제에 대해 설명하고, 각 함수의 예제 코드를 통해 실제 사용법을 살펴보겠습니다.
1. strtok
- 문자열을 토큰화하는 함수
strtok
함수 소개
strtok
함수는 문자열을 특정 구분자를 기준으로 나누어 토큰(token) 단위로 분할할 때 사용됩니다.
함수 원형
char *strtok(char *str, const char *delim);
매개변수 설명
str
: 분할할 문자열 (처음 호출 시 문자열을 입력, 이후 호출 시NULL
전달)delim
: 구분자 문자열 (공백, 콤마, 세미콜론 등 원하는 구분자를 지정 가능)
반환값
- 첫 호출에서는 첫 번째 토큰의 포인터를 반환합니다.
- 이후
NULL
을 인자로 전달하면, 이전 문자열의 다음 토큰을 반환합니다. - 더 이상 토큰이 없으면
NULL
을 반환합니다.
사용 시 주의점
strtok
함수는 원본 문자열을 수정합니다. (구분자 위치에\0
을 삽입)- 멀티스레드 환경에서는
strtok_r
을 사용해야 합니다.
strtok
예제 코드
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "C,Python;Java:JavaScript";
const char *delim = ",;:"; // 여러 개의 구분자 지정 가능
char *token;
token = strtok(str, delim);
while (token != NULL) {
printf("Token: %s\n", token);
token = strtok(NULL, delim);
}
return 0;
}
실행 결과
Token: C
Token: Python
Token: Java
Token: JavaScript
2. strdup
- 문자열을 복제하는 함수
strdup
함수 소개
strdup
함수는 문자열을 동적으로 복제하는 함수로, 원본 문자열과 동일한 새 문자열을 힙 메모리에 생성합니다.
함수 원형
char *strdup(const char *s);
매개변수 설명
s
: 복제할 문자열
반환값
- 복제된 문자열의 포인터를 반환합니다.
- 실패 시
NULL
을 반환합니다.
사용 시 주의점
strdup
함수는malloc
을 사용하여 메모리를 할당하므로, 사용 후 반드시free
를 호출해야 합니다.- 일부 시스템에서는
<string.h>
대신<strings.h>
에 선언되어 있을 수도 있습니다.
strdup
예제 코드
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main() {
char original[] = "Hello, world!";
char *copy;
copy = strdup(original);
if (copy == NULL) {
perror("strdup failed");
return 1;
}
printf("Original: %s\n", original);
printf("Copy: %s\n", copy);
free(copy); // 메모리 해제 필수
return 0;
}
실행 결과
Original: Hello, world!
Copy: Hello, world!
3. strtok
과 strdup
을 활용한 실전 예제
두 함수를 조합하여 문자열을 분할한 후 각 토큰을 복제하여 동적으로 저장하는 예제를 작성해 보겠습니다.
예제 코드
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main() {
char str[] = "Apple,Banana,Cherry";
const char *delim = ",";
char *token;
char *tokens[10];
int count = 0;
token = strtok(str, delim);
while (token != NULL && count < 10) {
tokens[count] = strdup(token); // 각 토큰을 복제하여 저장
if (tokens[count] == NULL) {
perror("strdup failed");
return 1;
}
count++;
token = strtok(NULL, delim);
}
printf("Stored tokens:\n");
for (int i = 0; i < count; i++) {
printf("%s\n", tokens[i]);
free(tokens[i]); // 메모리 해제
}
return 0;
}
실행 결과
Stored tokens:
Apple
Banana
Cherry
4. 마무리
이번 포스팅에서는 strtok
을 이용한 문자열 분할과 strdup
을 이용한 문자열 복제 방법을 살펴보았습니다.
주요 정리
strtok
은 문자열을 특정 구분자를 기준으로 분할하는 함수strdup
은 문자열을 동적으로 복제하는 함수 (malloc
을 사용하므로 free
필수)strtok
은 원본 문자열을 수정하며, 멀티스레드 환경에서는 strtok_r
사용 권장strdup
을 사용하여 strtok
으로 분할한 문자열을 동적으로 저장 가능
이제 string.h
의 다양한 함수를 활용하여 효율적인 문자열 처리를 수행해 보세요!
반응형
'c 언어 > c 표준 라이브러리(Standard C Library)' 카테고리의 다른 글
C 언어 `string.h`의 문자열 검색 함수 - `strchr`와 `strstr` (0) | 2025.02.12 |
---|---|
C 언어 문자열 비교 API - strcmp와 strncmp (0) | 2025.02.11 |
C 언어 `string.h`의 `strcat`과 `strncat` 함수 이해하기 (0) | 2025.02.10 |
C 표준 라이브러리 string.h 개요 및 문자열 관련 함수 (strlen, strcpy, strncpy) (0) | 2025.02.09 |
파일 에러 처리 함수(perror, clearerr, feof, ferror) - C 언어 (0) | 2025.02.08 |