int main()
{
char s1[30] = "Hello World love";
char *ptr = strtok(s1, " "); // 공백을 기준으로 자른다.
// ptr에 s1에서 공백을 기준으로 자른 문자열 "Hello"를 할당한다.
// 이때 기준이 되는 공백에 "NULL"을 할당한다. *중요*
while (ptr != NULL) // ptr에 NULL이 반환될 때까지 실행
{
printf("%s\n", ptr);
ptr = strtok(NULL, " "); // ptr에는 "Hello" 중 H의 포인터를 가지므로
// '문자 탐색' 처럼 ptr+1을 넣으면 "Hello" 중 H 다음 포인터인 e를 할당하고 만다.
// '대상문자열'에 NULL을 넣으면 공백에 넣은 NULL을 기준으로 다음 문자열을 자른다.
}
}
>>> Hello
>>> World
>>> love
ptr = strtok(NULL, " ");에서 NULL의 의미는 직전 strtok함수에서 처리했던 문자열에서 잘린 문자열만큼 다음 문자로 이동한 뒤 다음 문자열을 자른다.
원본 문자열을 자르기 때문에 변경됨
char s1 = "the Little Prince";
char ptr = strtok(s1, " ");
이처럼 하면 오류가난다
리터럴 문자열을 할당하여 's1' 포인터가 읽기전용이라도 'ptr'에 저장하기 때문에 될 것이라 생각하였지만 strtok()는 "기준문자"에 공백을 넣기 때문에 안되는 것이다.
char *s1 = malloc(sizeof(char) * 10);
strcpy(s1, "Hello World Love");
char *ptr = strtok(s1, " ");
리터럴 문자열을 할당하지 않고 malloc()으로 메모리를 할당한 뒤 strcpy()로 문자열을 넣어서 strtok()를 하면 된다.
char s1[30] = "2020-15-23T14:23:33";
char *ptr = strtok(s1, "-T;");
while (ptr != NULL)
{
printf("%s\n", ptr);
ptr = strtok(NULL, "-T;");
}
>>> 2020
>>> 15
>>> 23
>>> 14
>>> 23
>>> 33
'기준문자'에 여러가지를 넣어서 자를 수 있다.
char s1[30] = "i love korean yo";
char *sArr[10] = { NULL, }; // 자른 문자열 포인터 주소를 저장할 문자열 포인터 배열 선언
char *ptr = strtok(s1, " ");
int i = 0;
while (ptr != NULL)
{
sArr[i] = ptr; 문자형 포인터 배열의 인덱스 마다 strtok()로 자른 문자열의 포인터를 저장한다.
i++;
ptr = strtok(NULL, " ");
}
for (int i = 0; i < 10; i++)
{
if (sArr[i] != NULL)
printf("%s\n", sArr[i]);
}
>>> i
>>> love
>>> korean
>>> yo