strtok를 이용하여 문자열을 원하는 특정 문자로 나누는 방법

C언어의 string.h Library에 포함된 strtok() 함수를 통하여 문자열을 원하는 특정 문자로 나눌 수 있다.

아래 코드는 사용 예제 코드이다.

1. 필요 헤더

#include <string.h>

2. 함수의 원형, 반환값과 파라미터

char* strtok(char *sourceString, const char *delimiter);

sourceString: 자르고자 하는 문자열 포인터
delimiter: 구분하고자 하는 특정 문자
Return: 성공시 sourceString 배열에서의 시작 포인터주소, 실패시 NULL

3. 사용 방법

한 문자열을 계속해서 구분하여 반환받고자 하는 경우에는 위 코드처럼 최초 strtok 함수를 호출한 이후, 첫번째 파라미터에 NULL을 준다.

이렇게 하는 이유로는 strtok 함수 내에 static으로 선언된 포인터가 존재하고 있는데, 최초 호출 뒤에 이 static 포인터가 소스 문자열의 다음 시작 주소를 가지고 있다.
따라서, 소스 문자열을 위 예제처럼 계속 구분하고자 할 때에는 최초 호출이후 NULL을 파라미터로 넘겨주게 되면 처음 소스 문자열을 계속해서 잘라낸다.

소스 문자열이 변경될 경우에는 파라미터에 변경된 문자열 포인터를 넘겨주면 된다.

4. 사용시 주의사항

4.1: 소스 문자열의 데이터 변경

-> 문자열을 구분지어 주고 난 뒤 구분자 대신에 null character (\0) 로 소스 문자열이 대체된다.
따라서, 원문을 복사해서 사용하는 것이 조금 더 바람직하다.

4.2: static 포인터로 인하여 thread 환경에서 사용시 문제가 발생할 소지가 있음.

-> 멀티 스레드 환경에서는 strtok 함수를 직접 구현하거나, strtok_r 등으로 대체해서 사용해야 한다.
그러지 않을 경우 static 포인터가 각기 다른 스레드에서 호출되는 순서에 따라 가르키고 있는 위치가 변경되므로 원하는 로직대로 작동하지 않을 가능성이 존재한다.

댓글 남기기