C++에서 문장을 단어로 분리하기
이번 글에서는 하나의 문장을 공백을 기준으로 개별 단어로 나누는 방법을 알아봅니다. 문장에 포함된 모든 단어를 추출하여 각각 별도의 줄에 출력하는 것이 목표입니다.
입력
I am a good boy
출력
I am a good boy
위 예시처럼 각 단어가 한 줄에 하나씩 출력됩니다.
동작 원리
구현 방식은 간단합니다. 문자열을 처음부터 끝까지 한 글자씩 순회하면서, 공백 문자를 만나면 그때까지 누적한 단어를 출력하고 버퍼를 초기화합니다. 공백이 아닌 문자는 현재 단어에 계속 이어 붙입니다. 마지막 단어 뒤에는 공백이 없으므로, 반복문이 종료된 후 남은 단어를 한 번 더 출력해 주어야 합니다.
예제 1
#include <iostream>
#include <string>
using namespace std;
void split(string st) {
string word = "";
for (char s : st) {
if (s == ' ') {
cout << word << endl;
word = "";
} else {
word = word + s;
}
}
cout << word << endl;
}
int main() {
string st = "Blood from heaven is mortal";
cout << "Blood from heaven is mortal" << endl;
split(st);
return 0;
}출력 결과
위 코드를 실행하면 다음과 같은 출력이 생성됩니다.
Blood from heaven is mortal Blood from heaven is mortal
예제 2
#include <iostream>
#include <string>
using namespace std;
void split(string st) {
string word = "";
for (char s : st) {
if (s == ' ') {
cout << word << endl;
word = "";
} else {
word = word + s;
}
}
cout << word << endl;
}
int main() {
string st = "type a text message";
cout << "type a text message" << endl;
split(st);
return 0;
}출력 결과
위 코드를 실행하면 다음과 같은 출력이 생성됩니다.
type a text message type a text message
참고: 더 간결한 대안
위 방법은 문자열 처리의 기본 원리를 이해하는 데 유용하지만, 실무에서는 <sstream> 헤더의 istringstream을 활용하면 훨씬 간결하게 구현할 수 있습니다.
#include <sstream>
...
istringstream iss(st);
string word;
while (iss >> word) {
cout << word << endl;
}스트림 연산자 >>는 자동으로 공백을 구분자로 처리해 주기 때문에, 직접 문자를 순회하는 코드보다 가독성과 안정성 면에서 유리합니다. 학습 목적이라면 두 가지 방식 모두 익혀두는 것을 권장합니다.