[C언어] str로 시작하는 문자열 함수 -2 | strtok, strtok_r, strspn, strcspn, strdup

2024. 5. 23. 21:25C언어

반응형

기본적인 문자열 복사, 비교, 검색 등의 str 함수들은 1편에

2024.05.21 - [컴퓨터언어/C언어] - [C언어] str로 시작하는 문자열 함수 -1 | strcpy, strcat, strchr, strlen, strcmp, strstr

 

[C언어] str로 시작하는 문자열 함수 -1 | strcpy, strcat, strchr, strlen, strcmp, strstr

C언어에서 'str' 로 시작하는 함수들은 문자열 처리를 위해 자주 사용되는 함수이며, 이 함수들은 표준 라이브러리 에 정의되어있다. 이번 글에서는 문자열을 복사, 비교, 검색과 길이 계산의 작

wolleyneerg.tistory.com


 

1. strtok

  • 문자열을 특정 구분 문자(토큰)로 분리.
  • 토큰을 찾을 수 없으면 NULL 반환.
char *strtok(char *str, const char *delim);
int main() {
    char str[] = "Hello, World! Welcome to C programming.";
    char *token;

    // 첫 번째 호출에서 분할할 문자열을 전달
    token = strtok(str, " ");
    
    // 이후 호출에서는 NULL을 전달하여 다음 토큰을 검색
    while (token != NULL) {
        printf("%s\n", token);
        token = strtok(NULL, " ");
    }    
    return 0;
}
Hello,
World!
Welcome
to
C
programming.
  • strtok 함수는 원본 문자열을 수정하여 구분 문자를 '\0'로 바꾸기 때문에 원본 문자열을 그대로 유지해야 하는 경우 원본 문자열을 복사하여 사용해야 함. 또한, 여러 스레드에서 동시에 호출할 때 문자가 발생할 수 있음.
  • strtok_r
    • POSIX 표준에서 위의 스레드 문제에 대한 대안으로 재진입(reentrant)이 가능한 strtok_r 함수를 설계.
char *strtok_r(char *str, const char *delim, char **saveptr);
#include <stdio.h>
#include <string.h>

int main() {
    char str[] = "Hello, World! Welcome to C programming.";
    char *token;
    char *saveptr;

    // 첫 번째 호출에서 분할할 문자열을 전달
    token = strtok_r(str, " ", &saveptr);
    
    // 이후 호출에서는 NULL과 상태 포인터를 전달하여 다음 토큰을 검색
    while (token != NULL) {
        printf("%s\n", token);
        token = strtok_r(NULL, " ", &saveptr);
    } 
    return 0;
}

 

2. strspn

  • 첫 번째 문자열에서 두 번째 문자열에 포함된 문자만으로 구성된 가장 긴 접두사의 길이를 반환
size_t strspn(const char *str1, const char *str2);
int main() {
    const char *str1 = "12345abc";
    const char *str2 = "1234567890";
    size_t length = strspn(str1, str2); // 동일한 접두사의 길이 5를 반환
}

 

3. strcspn

  • 첫 번째 문자열에서 두 번째 문자열에 포함되지 않은 문자만으로 구성된 가장 긴 접두사의 길이를 반환
size_t strcspn(const char *str1, const char *str2);
int main() {
    const char *str1 = "12345abc";
    const char *str2 = "abc";
    size_t length = strcspn(str1, str2); // 두 번째 문자열이 포함되지않은 접두사의 길이 5 반환
}

 

4. strdup

  • 문자열을 복사하여 새 메모리를 할당.(동적으로 할당)
  • 표준 C 라이브러리에는 포함되지 않지만 일부 컴파일러에서는 제공
  • 복사된 문자열은 동적 메모리(malloc)를 사용하여 할당되기 때문에 사용이 끝난 후 반드시 free 함수로 메모리 해제 해야 함. (메모리 누수 발생 방지)
  • 메모리 할당 실패 시 NULL 반환
char *strdup(const char *str);
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

int main() {
    const char *original = "Hello, World!";
    char *copy = strdup(original);
    
    if (copy == NULL) {
        perror("strdup failed");
        return 1;
    }
    
    printf("Original string: %s\n", original);
    printf("Copied string: %s\n", copy);
    
    // 동적 메모리 해제
    free(copy);
    
    return 0;
}
  • strdup 함수가 지원되지 않는 경우, 직접 구현하는 예제
#include <string.h>
#include <stdlib.h>

char *strdup(const char *str) {
    size_t len = strlen(str) + 1; // 널 문자를 포함한 길이
    char *copy = malloc(len);
    
    if (copy != NULL) {
        memcpy(copy, str, len);
    }
    
    return copy;
}

 


반응형