40.2 문자열 포인터 자르기

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

string_tokenize_pointer_error.c

char *s1 = "The Little Prince";   // 포인터에 문자열 리터럴 "The Little Prince"의 주소 저장

char *ptr = strtok(s1, " ");      // 실행 에러

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

이 코드를 실행하면 다음과 같이 에러가 발생합니다(주솟값은 실행할 때마다, 컴퓨터마다 달라집니다).

실행 결과

0xC0000005: 0x013A585D 위치를 기록하는 동안 액세스 위반이 발생했습니다.

문자열 포인터에 문자열 리터럴을 할당하는 대신 동적 메모리를 할당하고, 문자열을 복사하면 이 문제를 해결할 수 있습니다.

string_tokenize_memory.c

char *s1 = malloc(sizeof(char) * 30);    // char 30개 크기만큼 동적 메모리 할당

strcpy(s1, "The Little Prince");    // s1에 문자열 복사

char *ptr = strtok(s1, " ");    // 동적 메모리에 들어있는 문자열은 자를 수 있음

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

free(s1);    // 동적 메모리 해제