앞에서 문자열을 연결하는 함수를 보았다면, 이젠 반대로 문자열을 자르는 함수를 보게 된다. 주어진 조건에 맞는 단어 단위로 자르고 싶을 때에는 strtok 함수를 이용하면 된다. 지정한 구분자가 나오면 단어로 자르고 단어의 첫 분자에 대한 포인터를 반환한다.
- 함수이름 | 기능
- strtok | 문자열에서 구분자와 일치하는 문자가 나오면 단어로 자른다.
예제를 보면 좀 더 쉽게 이해할 수 있다. 예제에서는 어떤 구분자를 기준으로 단어를 자를 지 지정한다. delim에 공백문자를 넣었는데, 이는 공백 문자가 나오면 자르겠다는 것이다. 그렇게 하여 4 개의 단어로 다르는 것이다.
그리고 예시에서 보면 두 번째 strtok가 쓰이는 걸 보면 NULL이 있다. 이것이 중요하다. 문장과 포인터를 선언한 상태를 확인하자.
이 상태에서 strtok 함수를 호출하면 Hello라는 단어로 잘리고 ptr은 첫 글자를 가리키는 상태가 된다.
그 다음에 호출되는 strtok 호출부터는 str이 아닌 NULL을 첫 인수로 설정해야 한다. 그래야 두 번째 호출을 하면 Linux라는 단어로 잘리고 ptr은 두 번째 단어의 첫 글자를 가리킨다.
여기서 내 글로 C언어를 처음 배우는 사람을 위해, 왜 두번째부터 인수에 NULL을 삽입하는지를 작성하겠다. strtok 메뉴얼에도 나와있는 것이지만, 첫 번째 작업을 하고 났을 때에 잘리고 난 상태에서는 NULL이 아닌 다른 값으로 되어 있다. 그렇기 때문에 앞에서 자르고 남은 서브 문자열에서의 시작점을 만들어 줘야 하는데, 그것이 첫 번째로 잘리고 난 다음의 문자열이 끝났다는 것으로 할 수 있게끔 NULL을 삽입하여 주는 것이다. 즉, “Hello” 바로 다음에 공백문자를 발견하여 문자열을 자르고, 그 잘린 포인터에 NULL을 넣어서 앞의 문자열은 잘려서 끝났고 이제 그 다음의 나머지 문자열을 텀색하도록 하는 것이다. 그러면 두 번째부터는 “Linux C Programming”이라는 서브 문자열에서 탐색을 진행한다. Linux를 잘라낸 다음에도 또 NULL을 삽입해서 서브스트링을 “C Programming”으로 만들어주는 것이다. 이런 식으로 반복해서 문자열을 하나 하나 잘라내기 위해 포인터를 초기화 해주는 것이다.