c 문자열 자르기

떵떵·2022년 6월 25일
0

배열 문자열 자르기

strtok(대상문자열, 기준문자);

  • 대상문자열에서 기준문자로 자른 문자열을 반환
  • 더이상 자를 문자열이 없으면 NULL을 반환
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함수에서 처리했던 문자열에서 잘린 문자열만큼 다음 문자로 이동한 뒤 다음 문자열을 자른다.

주의

원본 문자열을 자르기 때문에 변경됨

포인터 문자열 자르기

strtok(대상문자열, 기준문자);

  • 대상문자열에서 기준문자로 자른 문자열을 반환
  • 더이상 자를 문자열이 없으면 NULL을 반환

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

0개의 댓글