Notice
Recent Posts
Recent Comments
Link
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

문타쿠, 공부하다.

[C언어 코딩 도장] Unit 45. 문자열 자르기 본문

C언어/C언어 코딩 도장

[C언어 코딩 도장] Unit 45. 문자열 자르기

개발새발 문타쿠 2023. 10. 2. 22:51

주어진 문자열을 자르는 방법을 알아보자.

-> 문자열 자르기는 포인터를 이용한다.

45.1 문자를 기준으로 문자열 자르기

문자열에서 문자를 자르는 방법

-> strtok 함수를 사용하면 특정 문자를 기준으로 문자열을 자를 수 있으며, string.h 헤더 파일에 선언되어 있다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>

int main(void)
{
    char s1[30] = "The Little Prince";

    // " " 공백 문자를 기준으로 문자열을 자름, 포인터 반환
    // 기준 문자를 ' ' 작은 따옴표로 묶으면 ㄴㄴ
    char* ptr = strtok(s1, " ");

    // 자를 문자열이 나오지 않을 때까지 반복
    while (ptr != NULL)
    {
        // 자른 문자열 출력
        printf("%s\n", ptr);
        // 다음 문자열을 잘라서 포인터를 반환
        ptr = strtok(NULL, " ");
    }

    return 0;
}


strtok 함수의 동작

1단계

char *ptr = strtok(s1, " ")

  • 문자열 s1에서 공백을 찾아 NULL로 채운다.
  • 문자열의 첫 부분인 The를 잘라 포인터로 반환한다.

2단계

ptr = strtok(NULL, " ")

  • strtok에 NULL을 넣에 앞에서 잘린 문자열 만큼 다음 문자로 이동한다.
  • 그리고 다시 공백 문자를 찾아 NULL로 채운 뒤 Little을 잘라 포인터로 반환한다.
  • 문자열 끝에 있는 NULL을 만날때까지 계속 반복한다.

3단계

ptr = strtok(NULL, " ")

  • strtok에 NULL을 넣에 앞에서 잘린 문자열 만큼 다음 문자로 이동한다.
  • 이번에는 공백이 아닌 문자열의 마지막 NULL을 만났으므로 NULL을 그대로 두고 Prince를 반환환다.

4단계

ptr = strtok(NULL, " ")

  • 직전 strtok에서 공백을 만나지 못해 더는 자를 문자열이 없음 -> NULL을 반환하고 while 반복문을 벗어난다.

* strtok 함수를 사용할 때는 처음에만 자를 문자열을 넣어주고, 그 다음부터는 NULL을 넣어준다.

 

* strtok 함수는 문자열을 새로 생성해서 반환하는 것이 아니라, 자르는 부분을 NULL 문자로 채운 뒤 잘린 문자열의 포인터를 반환한다.

-> 이는 원본 문자열의 내용을 바꾸므로 주의해서 사용해야 한다.


45.2 문자열 포인터 자르기

문자열 포인터에 문자열 리터럴이 들어 있어서 읽기 전용인 상태라면 strtok 함수를 사용할 수 없다.

-> 동적 메모리를 할당하고, 문자열을 복사하여 자르면 가능

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
    char* s1 = malloc(sizeof(char) * 30);

    strcpy(s1, "The Little Prince");

    char* ptr = strtok(s1, " ");

    while (ptr != NULL)
    {
        printf("%s\n", ptr);
        ptr = strtok(NULL, " ");
    }

    free(s1);

    return 0;
}

45.3 날짜와 시간 값 자르기

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>

int main(void)
{
    char s1[30] = "2023-10-02T20:42:59";

    // -, T, : 을 기준으로 문자열을 자름, 포인터 반환
    char* ptr = strtok(s1, "-T:");

    while (ptr != NULL)
    {
        printf("%s\n", ptr);
        ptr = strtok(NULL, "-T:");
    }

    return 0;
}


45.4 자른 문자열 보관하기

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>

int main(void)
{
    char s1[30] = "The Little Prince";
    char* sArr[10] = { NULL, };

    int i = 0;

    char* ptr = strtok(s1, " ");
   
    while (ptr != NULL)
    {
        sArr[i] = ptr;
        i++;

        ptr = strtok(NULL, " ");
    }

    for (int i = 0; i < 10; i++)
    {
        if (sArr[i] != NULL)
            printf("%s\n", sArr[i]);
    }

    return 0;
}