Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C/C++ 문자열의 단어를 반복 처리하는 가장 우아한 방법

C/C++ 문자열의 단어를 반복(iterate)하는 데 딱 하나의 '우아한' 방법이 존재하지는 않습니다. 어떤 개발자에게는 가독성이 높은 코드가 가장 우아한 방법일 수 있고, 또 다른 개발자에게는 실행 성능이 뛰어난 코드가 더 우아하다고 여겨질 수 있기 때문입니다.

이 글에서는 C/C++ 문자열의 단어를 순회할 때 활용할 수 있는 대표적인 두 가지 방법을 소개합니다.

1. stringstream으로 공백 기준 단어 읽기

첫 번째 방법은 stringstream을 사용하여 공백으로 구분된 단어를 하나씩 읽어오는 것입니다. 이 방식은 다소 단순하지만, 적절한 유효성 검사만 추가해 주면 실무에서도 충분히 유용하게 사용할 수 있습니다.

예제 코드

#include <vector>
#include <string>
#include <sstream>
using namespace std;

int main() {
    string str("Hello from the dark side");
    string tmp;              // 각 반복마다 단어를 저장할 문자열
    stringstream str_strm(str);
    vector<string> words;    // 단어를 담을 벡터 생성

    while (str_strm >> tmp) {
        // tmp가 비어 있는지 등의 검사를 추가할 수 있습니다.
        // 필요하다면 !, ., ? 같은 특수문자도 제거하세요.
        words.push_back(tmp);
    }
}

>> 연산자는 스트림에서 공백(스페이스, 탭, 줄바꿈)을 자동으로 건너뛰고 토큰을 추출하기 때문에, 별도의 구분자 설정 없이도 문장을 단어 단위로 손쉽게 분리할 수 있다는 장점이 있습니다.

2. getline 함수와 사용자 지정 구분자 활용

두 번째 방법은 getline 함수에 원하는 구분자(delim)를 직접 지정하여 문자열을 분할하는 것입니다. 공백 외에 쉼표(,), 세미콜론(;) 등 다양한 구분자를 처리해야 할 때 특히 유용합니다.

예제 코드

#include <vector>
#include <string>
#include <sstream>
using namespace std;

int main() {
    std::stringstream str_strm("Hello from the dark side");
    std::string tmp;
    vector<string> words;
    char delim = ' '; // 분할에 사용할 구분자 정의

    while (std::getline(str_strm, tmp, delim)) {
        // tmp가 비어 있는지 등의 검사를 추가할 수 있습니다.
        // 필요하다면 !, ., ? 같은 특수문자도 제거하세요.
        words.push_back(tmp);
    }
}

정리

두 방법 모두 문자열을 단어 단위로 분리하여 vector<string>에 저장한다는 동일한 목표를 가집니다. 일반적인 공백 기반 분리라면 첫 번째 stringstream 방식이 간결하고, 특정 구분자가 필요한 상황이라면 두 번째 getline 방식이 더 적합합니다. 실제 프로젝트에서는 빈 문자열 검사나 특수문자 제거 등의 후처리 로직을 함께 구현하는 것이 좋습니다.