이번 글에서는 C 언어에서 문자열을 토큰(token) 단위로 분리하는 방법을 알아보겠습니다. C 표준 라이브러리는 이를 위해 strtok() 함수를 제공하며, 이 함수는 구분자(delimiter)를 기준으로 하나의 문자열을 여러 개의 토큰으로 나누는 역할을 합니다.
strtok() 함수란?
char *strtok(char *str, const char *delim) 함수는 문자열 str을 지정된 구분자 delim을 기준으로 일련의 토큰들로 분해합니다.
함수 선언
char *strtok(char *str, const char *delim)
매개변수 설명
이 함수는 두 개의 매개변수를 받습니다.
- str — 분해할 대상 문자열입니다. 함수 호출 후 원본 문자열의 내용이 수정되며, 작은 문자열(토큰)들로 잘게 나뉩니다.
- delim — 구분자들을 담고 있는 C 문자열입니다. 호출할 때마다 다른 구분자를 사용할 수도 있습니다.
함수는 문자열에서 찾은 첫 번째 토큰에 대한 포인터를 반환하며, 더 이상 가져올 토큰이 없으면 NULL 포인터를 반환합니다.
예제 코드
다음 예제는 하이픈(-)을 구분자로 사용하여 문자열을 토큰 단위로 분리하는 방법을 보여줍니다.
#include <string.h>
#include <stdio.h>
int main () {
char str[80] = "This is - www.tutorialspoint.com - website";
const char s[2] = "-";
char *token;
/* 첫 번째 토큰 가져오기 */
token = strtok(str, s);
/* 나머지 토큰들을 순회하며 출력 */
while( token != NULL ) {
printf( " %s\n", token );
token = strtok(NULL, s);
}
return(0);
}
실행 결과
This is www.tutorialspoint.com website
동작 원리 이해하기
strtok()의 동작 방식에는 몇 가지 중요한 특징이 있습니다.
- 첫 번째 호출에서는 대상 문자열
str을 인자로 전달하여 첫 번째 토큰을 얻습니다. - 이후 호출에서는 첫 번째 인자로
NULL을 전달해야 합니다. 그러면 함수가 내부적으로 기억하고 있는 위치에서 다음 토큰을 계속해서 찾아줍니다. - 더 이상 남은 토큰이 없으면
NULL을 반환하므로, 위 예제처럼 while 반복문과 함께 사용하는 것이 일반적입니다.
주의사항
strtok()는 원본 문자열에 구분자 위치에 NULL 문자(\0)를 삽입하는 방식으로 동작하기 때문에 원본 문자열이 변경됩니다. 따라서 원본 데이터를 보존해야 하는 경우에는 복사본을 만든 후 strtok()를 적용하는 것이 안전합니다. 또한 이 함수는 내부 상태(static 변수)를 유지하므로 멀티스레드 환경에서는 스레드 안전하지 않으며, 이 경우 strtok_r() 사용을 권장합니다.