c 언어/c 표준 라이브러리(Standard C Library)

C 표준 라이브러리 `string.h`의 문자열 변환 함수 `strtok`, `strdup`

임베디드 친구 2025. 2. 13. 09:13
728x90
반응형

C 언어에서 문자열을 다룰 때, 문자열을 분할하거나 복제해야 하는 경우가 자주 발생합니다. 이러한 작업을 효율적으로 수행할 수 있도록 표준 라이브러리 <string.h>에서는 strtokstrdup 함수를 제공합니다.

이번 포스팅에서는 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. strtokstrdup을 활용한 실전 예제

두 함수를 조합하여 문자열을 분할한 후 각 토큰을 복제하여 동적으로 저장하는 예제를 작성해 보겠습니다.

예제 코드

#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의 다양한 함수를 활용하여 효율적인 문자열 처리를 수행해 보세요!

반응형