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); // 동적 메모리 해제