본문 바로가기

진리는어디에

STL string을 이용해 텍스트 라인을 단어로 쪼개기

이번 장에서는 STL의 string을 이용해 특정 구분자로 나뉘어 있는 텍스트 한줄을 여러개의 단어들로 쪼개는 함수를 만들어 보도록 하겠습니다.

      1 void split(const string& text, string& separators, vector<string>& words) {
      2     int n = text.length();
      3     int start, stop;
      4
      5     start = text.find_first_not_of(separators);
      6     while ((start >= 0) && (start < n)) {
      7         stop = text.find_first_of(separators, start);
      8         if ((stop < 0) || (stop > n))
      9             stop = n;
     10         words.push_back(text.substr(start, stop - start));
     11         start = text.find_first_not_of(separators, stop+1);
     12     }
     13 }

이 함수는 text 문자열에서 separators와 매칭되는 구분자를 찾아 words 벡터에 저장합니다. 직접적인 리턴은 없지만 파라메터를 통해 리턴을 하는 구조입니다.

5 라인의 'find_first_not_of' 함수는 'separators'와 매칭되지 않는 가장 첫번째 위치를 찾습니다. 이 함수의 프로토 타입은 뒤에 어디서 부터 시작 할지 위치를 정해주는 파라메터가 하나 더 있는데 기본인자로 '0'이 지정되어 있어 아무것도 지정하지 않게 되면 처음부터 검색을 시작합니다.

그리고 루프를 돌면서 그 뒤에 나타나는 구분자에 속하는 문자열을 찾습니다. 바로 7라인의 'find_first_of'라는 함수가 하는 역할 입니다. 이 함수에서 리턴되는 것은 이름 그대로 'separators'와 매칭되는 문자열의 가장 처음 위치를 리턴하는 것이지요.

이렇게 문자열의 시작 부터 구분자의 앞 까지 위치를 알아 내었습니다. 이제 해야 할 일은 문자열의 시작 부터 구분자까지 끊어 내어 벡터에 저장하는 일이겠지요. 이것을 위해 10 라인의 'substr' 함수가 사용되었습니다. 이 함수에서 리턴 되는 값을 벡터에 저장하는 것 까지.. 이 과정을 문자열이 끝날 때 까지 반복하는 것입니다.

Ref.
 stl reference : http://www.sgi.com/tech/stl/table_of_contents.html
 code : http://oopsla.snu.ac.kr/~sjjung/stl/

유익한 글이었다면 공감(❤) 버튼 꾹!! 추가 문의 사항은 댓글로!!