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

C++ 문자열 스트림(stringstream) 완벽 가이드: 개념부터 실전 예제까지

C++에서 stringstream(문자열 스트림)은 문자열 객체를 스트림과 연결해 주는 클래스입니다. 이를 활용하면 마치 cin으로 입력을 읽듯이 문자열로부터 데이터를 자유롭게 읽고 쓸 수 있습니다.

문자열을 직접 파싱하는 것보다 훨씬 직관적이고 안전하기 때문에, 단어 분리, 형식 변환 등 다양한 작업에 널리 사용됩니다.

stringstream의 주요 메서드

stringstream 클래스는 다음과 같은 핵심 메서드와 연산자를 제공합니다.

  • clear(): 스트림의 오류 상태 플래그를 초기화하여 스트림을 재사용할 수 있게 합니다.
  • str(): 스트림 내부에 담긴 문자열 객체를 가져오거나(get), 새로 설정(set)합니다.
  • operator << : 문자열이나 숫자 등의 데이터를 stringstream에 추가합니다.
  • operator >> : stringstream 객체로부터 데이터를 읽어옵니다.

예제 1: 문장을 단어별로 분리하기

첫 번째 예제는 stringstream을 사용해 하나의 문장을 공백 기준으로 단어별로 나누어 벡터(vector)에 저장하는 프로그램입니다.

#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

>> 연산자는 공백을 만날 때마다 자동으로 구분해 주기 때문에, 별도의 복잡한 파싱 로직 없이도 손쉽게 단어를 추출할 수 있습니다.

예제 2: 10진수를 16진수로 변환하기

두 번째 예제는 stringstream과 hex 조작자(manipulator)를 조합하여 10진수를 16진수 문자열로 변환하는 방법을 보여줍니다.

#include<iostream>
#include<sstream>
using namespace std;

int main(){
    int decimal = 61;
    stringstream my_ss;

    my_ss << hex << decimal;   // 10진수를 16진수로 변환하여 삽입
    string res = my_ss.str();  // 결과 문자열 추출

    cout << "61의 16진수 값: " << res;
}

실행 결과

61의 16진수 값: 3d

정리

이처럼 stringstream은 문자열 파싱과 수치 변환 모두에 유용하게 활용됩니다. <<>> 연산자 덕분에 코드가 간결하고 가독성이 높아지며, atoi, sprintf 같은 C 스타일 함수보다 타입 안전성 측면에서도 우수합니다. 문자열 기반 데이터 처리가 필요하다면 stringstream 사용을 적극 권장합니다.