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

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


C/C++ 문자열의 단어를 반복하는 '가장 우아한' 방법은 하나로 정해져 있지 않습니다. 어떤 개발자에게는 가독성이 뛰어난 코드가 가장 우아하게 느껴지고, 또 다른 개발자에게는 실행 성능이 좋은 코드가 더 우아할 수 있습니다. 이 글에서는 문자열의 단어를 반복 처리하는 두 가지 방법을 소개하며, 그중 첫 번째인 stringstream을 사용해 공백으로 구분된 단어를 읽어오는 방식부터 살펴보겠습니다.

stringstream 방식은 다소 제한적이지만, 적절한 예외 처리와 검증 로직만 추가해 주면 대부분의 상황에서 충분히 잘 동작하는 실용적인 방법입니다.

예제 코드

#include <iostream>
#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);
    }
    for(int i = 0; i<words.size(); i++)
        cout << words[i] << endl;
}

실행 결과

Hello
from
the
dark
side

코드 설명

stringstream은 문자열을 입력 스트림처럼 다룰 수 있게 해주는 C++ 표준 라이브러리의 클래스입니다. 위 코드에서는 원본 문자열 str을 stringstream 객체에 넣은 뒤, 추출 연산자(>>)를 통해 공백을 기준으로 단어를 하나씩 읽어옵니다. 스트림에서 더 이상 읽을 단어가 없으면 while 루프가 자동으로 종료되므로 별도의 종료 조건을 작성할 필요가 없다는 점이 큰 장점입니다.

읽어온 단어들은 push_back() 함수를 통해 vector<string> 컨테이너에 순차적으로 저장되며, 이후 일반적인 for 루프나 범위 기반 for 문(C++11 이상)을 사용해 손쉽게 출력하거나 후속 처리를 할 수 있습니다.