본문 바로가기

Programming/C&CPP

C++ std::string 토큰(Token) 분리 방법(Tokenize)

한 문자열에 데이터가 공백 등의 특정 문자를 기준으로 저장되는 경우가 있습니다.

CSV 파일 형식의 경우 데이터가 ,(Comma)로 구분됩니다.

각각의 필드를 가져오기 위해서 쉼표를 기준으로 끊어서 문자열을 가져와야 합니다.

이런 과정을 Tokenize라고 하며 대부분의 프로그래밍에서 활용됩니다.

C에서는 char 배열을 strtok 함수로 특정 문자를 기준으로 토큰 추출이 가능합니다.

C#과 MFC의 Tokenize 방법은 아래 링크에서 확인 가능합니다.

2015/06/22 - [Programming/Win32&MFC&COM] - CString 토큰(Token)으로 분리시키기(AfxExtractSubString)

2016/01/23 - [Programming/CSharp] - String.Split으로 토큰 단위로 파싱하기

C++ 역시 몇 가지 방법을 제공합니다.

C++ std::string의 토큰 분리 방법은 다음과 같습니다.


1. std::getline()

먼저 std::getline()을 사용해서 string 분리가 가능합니다.

getline 함수를 사용하려면 stringstream에 string 값을 입력하고 stringstream을 사용해야 합니다.

std::getline()을 사용하면 구분자(delimiter)를 마지막에 지정할 수 있습니다.

원하는 구분자를 지정해서 쉽게 토큰 추출이 가능합니다.

하단 예제에서 tokenize_getline()을 확인하시면 됩니다.


2. >> 연산자(operator)

>> 연산자를 사용해도 토큰 분리가 가능합니다.

std::getline()과 거의 동일한 방법으로 토큰 분리가 가능합니다.

다만 >> 연산자는 구분자를 따로 지정할 수 없습니다.

그렇기 때문에 공백문자(\n, \t, 스페이스 등)로 구분된 문자만 가능합니다.

하단 예제의 tokenize_operator() 함수로 tokenize_getline()과 거의 동일한 것을 확인할 수 있습니다.


3. Boost Tokenizer

마지막으로 소개할 방법은 Boost 라이브러리가 제공하는 Tokenizer입니다.

Boost를 사용하는 프로젝트에서는 Tokenizer를 사용해서 토큰 분리가 가능합니다.

Tokenizer는 좀 더 세분화된 구분자 설정을 할 수 있습니다.

구분자로 문자열을 사용할 수 있기 때문에 한 개 이상의 구분자 설정이 가능합니다.

그리고 구분자 자체가 토큰으로 사용될 수 있도록 설정이 가능합니다.

하단의 tokenize_boost()에서 Boost Tokenizer로 토큰 분리하는 것을 확인할 수 있습니다.

char_separator를 생성할 때 dropped와 kept로 구분자가 설정됩니다.

dropped는 구분자의 역할만 하는 것이고 kept는 구분자 역할과 함께 그 자체가 토큰도 됩니다.

그리고 마지막으로 빈 문자열인 토큰을 어떻게 처리할 것인가 설정할 수 있습니다.

keep_empty_tokens 사용시 빈 문자열도 토큰이 되며 drop_empty_tokens는 빈 문자열은 버립니다.

예제에서는 keep_empty_tokens를 사용해서 빈 문자열과 kept_delimiter가 결과에 포함됩니다.


전체 샘플 코드는 다음과 같습니다.

상황에 맞게 토큰 분리 함수를 작성해서 사용하면 됩니다.