40.4 자른 문자열 보관하기

지금까지 자른 문자열을 출력만 하고 끝냈습니다. 하지만 실제로 프로그램을 작성할 때는 자른 문자열을 보관했다가 계속 사용하는 경우가 많습니다. 예를 들어 문자열을 자른 뒤 다른 코드를 실행하고, 자른 문자열을 사용한다든지 자른 문자열을 또 다른 처리에 사용한다든지 하는 상황이 생길 수 있습니다. 즉, 문자열을 자르는 while 반복문 안에서 모든 처리를 할 수 없는 상황에서는 자른 문자열을 보관할 필요가 있습니다.

이번에는 문자열 포인터 배열에 자른 문자열을 보관해보겠습니다.

string_tokenize_store_array.c

#define _CRT_SECURE_NO_WARNINGS    // strtok 보안 경고로 인한 컴파일 에러 방지
#include <stdio.h>
#include <string.h>    // strtok 함수가 선언된 헤더 파일

int main()
{
    char s1[30] = "The Little Prince";    // 크기가 30인 char형 배열을 선언하고 문자열 할당
    char *sArr[10] = { NULL, };    // 크기가 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)           // 문자열 포인터 배열의 요소가 NULL이 아닐 때만
            printf("%s\n", sArr[i]);   // 문자열 포인터 배열에 인덱스로 접근하여 각 문자열 출력
    }

    return 0;
}

실행 결과

The
Little
Prince

먼저 char *sArr[10] = { NULL, };와 같이 자른 문자열을 보관할 문자열 포인터 배열을 선언하고 NULL로 초기화했습니다. 여기서 NULL 뒤에 , (콤마)를 붙여주면 배열의 모든 요소가 NULL로 초기화됩니다.

while 반복문 안에서는 sArr[i] = ptr;과 같이 자른 문자열의 메모리 주소를 배열에 저장하고, 배열의 인덱스를 증가시킵니다.

포인터 ptr은 반복문을 반복하면서 문자열을 자를 때마다 안에 저장된 메모리 주소가 계속 바뀌므로 나중에 다시 사용할 수 없습니다. 하지만 예제처럼 ptr에 저장된 메모리 주소가 바뀌기 전에 다른 곳에 보관해두면 자른 문자열을 나중에도 계속 사용할 수 있습니다.

지금까지 문자열을 자르는 방법을 배웠는데 포인터를 이용하는 방식이라 내용이 좀 복잡하고 어려웠습니다. 여기서 함수의 동작 방식까지 모두 이해할 필요는 없습니다. 나중에 문자열을 잘라야 할 때 다시 돌아와서 찾아보세요.