77 – 문자열을 단어로 자르는 함수

앞에서 문자열을 연결하는 함수를 보았다면, 이젠 반대로 문자열을 자르는 함수를 보게 된다. 주어진 조건에 맞는 단어 단위로 자르고 싶을 때에는 strtok 함수를 이용하면 된다. 지정한 구분자가 나오면 단어로 자르고 단어의 첫 분자에 대한 포인터를 반환한다.

  • 함수이름 | 기능
  • strtok | 문자열에서 구분자와 일치하는 문자가 나오면 단어로 자른다.

예제를 보면 좀 더 쉽게 이해할 수 있다. 예제에서는 어떤 구분자를 기준으로 단어를 자를 지 지정한다. delim에 공백문자를 넣었는데, 이는 공백 문자가 나오면 자르겠다는 것이다. 그렇게 하여 4 개의 단어로 다르는 것이다.

20170422_23562120170422_235635

그리고 예시에서 보면 두 번째 strtok가 쓰이는 걸 보면 NULL이 있다. 이것이 중요하다. 문장과 포인터를 선언한 상태를 확인하자.

그림5

이 상태에서 strtok 함수를 호출하면 Hello라는 단어로 잘리고 ptr은 첫 글자를 가리키는 상태가 된다.

그림3

그 다음에 호출되는 strtok 호출부터는 str이 아닌 NULL을 첫 인수로 설정해야 한다. 그래야 두 번째 호출을 하면 Linux라는 단어로 잘리고 ptr은 두 번째 단어의 첫 글자를 가리킨다.

그림4

여기서 내 글로 C언어를 처음 배우는 사람을 위해, 왜 두번째부터 인수에 NULL을 삽입하는지를 작성하겠다. strtok 메뉴얼에도 나와있는 것이지만, 첫 번째 작업을 하고 났을 때에 잘리고 난 상태에서는 NULL이 아닌 다른 값으로 되어 있다. 그렇기 때문에 앞에서 자르고 남은 서브 문자열에서의 시작점을 만들어 줘야 하는데, 그것이 첫 번째로 잘리고 난 다음의 문자열이 끝났다는 것으로 할 수 있게끔 NULL을 삽입하여 주는 것이다. 즉, “Hello” 바로 다음에 공백문자를 발견하여 문자열을 자르고, 그 잘린 포인터에 NULL을 넣어서 앞의 문자열은 잘려서 끝났고 이제 그 다음의 나머지 문자열을 텀색하도록 하는 것이다. 그러면 두 번째부터는 “Linux C Programming”이라는 서브 문자열에서 탐색을 진행한다. Linux를 잘라낸 다음에도 또 NULL을 삽입해서 서브스트링을 “C Programming”으로 만들어주는 것이다. 이런 식으로 반복해서 문자열을 하나 하나 잘라내기 위해 포인터를 초기화 해주는 것이다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.