이 글에서는 C++에서 문자열을 토큰(token) 단위로 분리하는 방법에 대해 알아보겠습니다.
C 언어에서는 문자 배열(char array)을 다룰 때 strtok() 함수를 사용해 문자열을 나눌 수 있습니다. 하지만 C++에서는 std::string 클래스를 사용하기 때문에 접근 방식이 조금 다릅니다. 이번 글에서는 특정 구분자(delimiter)를 기준으로 문자열을 잘라내는 방법을 살펴보겠습니다.
stringstream과 getline() 함수 활용
C++의 기능을 활용하려면 먼저 std::string 객체를 문자열 스트림(stringstream)으로 변환해야 합니다. 그런 다음 getline() 함수를 사용하면 손쉽게 문자열을 분리할 수 있습니다.
getline() 함수는 세 가지 인자를 받습니다.
- 첫 번째 인자: 입력으로 사용할 문자열 스트림
- 두 번째 인자: 추출된 결과를 저장할 문자열 변수
- 세 번째 인자: 스트림 읽기를 멈추게 할 구분자
구분자를 만날 때마다 getline()은 해당 지점까지의 부분 문자열을 반환하고, 반복문과 함께 사용하면 전체 문자열을 여러 개의 토큰으로 나눌 수 있습니다.
예제 코드
다음 예제는 쉼표(,)를 구분자로 사용하여 하나의 문자열을 여러 개의 토큰으로 분리한 뒤, 벡터(vector)에 저장하고 출력하는 프로그램입니다.
#include <iostream>
#include <vector>
#include <sstream>
using namespace std;
int main() {
string my_string = "Hello,World,India,Earth,London";
stringstream ss(my_string); // my_string을 문자열 스트림으로 변환
vector<string> tokens;
string temp_str;
while(getline(ss, temp_str, ',')){ // 쉼표(,)를 구분자로 문자열 분리
tokens.push_back(temp_str);
}
for(int i = 0; i < tokens.size(); i++) {
cout << tokens[i] << endl;
}
}실행 결과
Hello World India Earth London
실행 결과를 보면 쉼표를 기준으로 문자열이 정상적으로 분리되어 각 토큰이 한 줄씩 출력된 것을 확인할 수 있습니다.
정리
C++에서 문자열을 토큰화하려면 <sstream> 헤더에 포함된 stringstream과 getline() 함수를 조합하는 것이 가장 간단하고 직관적인 방법입니다. 이 방식은 C 스타일의 strtok()와 달리 원본 문자열을 수정하지 않고도 안전하게 문자열을 분리할 수 있다는 장점이 있습니다.