관리 메뉴

Bull

[C++/lib:sstream] 문자열 파싱하기 (토큰화) 본문

Computer Language/C++

[C++/lib:sstream] 문자열 파싱하기 (토큰화)

Bull_ 2024. 3. 10. 00:05

sstream

C++의 sstream 라이브러리는 스트림 기반의 입력/출력을 메모리에서 처리할 수 있게 해주는 클래스들을 제공한다.

 

이 라이브러리에는 문자열 입력과 출력을 위한 주요 클래스인 istringstream, ostringstream, 그리고 stringstream이 포함되어 있다.

  • istringstream (Input String Stream): 문자열에서 데이터를 읽기 위한 스트림이다.

    이 클래스를 사용하면 문자열 내용을 마치 입력 스트림처럼 다룰 수 있어서,

    복잡한 형태의 데이터를 문자열로부터 파싱(분석)하는 데 유용하다.

 

  • ostringstream (Output String Stream): 데이터를 문자열로 출력하기 위한 스트림이다.

    이 클래스는 데이터를 문자열 형태로 변환해야 할 때 사용된다.

    예를 들어, 다양한 타입의 데이터를 문자열로 포매팅하고 합치는 작업에 사용될 수 있다.

 

  • stringstream (String Stream): istringstream과 ostringstream의 기능을 모두 가진 클래스로, 데이터를 문자열로 읽고 쓸 수 있는 스트림이다.

    이 클래스는 문자열에서 데이터를 읽고, 그 문자열에 데이터를 쓰는 등의 작업이 동시에 필요할 때 유용하다.

 

정리하자면, sstream 라이브러리는 문자열을 다루는 다양한 상황에서 매우 유용하게 사용된다.

예를 들어, 사용자 입력 검증, 파일로부터 읽은 데이터의 파싱, 데이터의 문자열로의 변환 및 포매팅 등 다양한 작업을 수행할 때 사용할 수 있다.

또한 문자열과 스트림을 사용하여 복잡한 데이터 처리를 보다 쉽게 구현할 수 있게 도와준다.

 

 

 

 

 

예시

https://www.acmicpc.net/problem/11024

 

11024번: 더하기 4

첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있으며, N(1 ≤ N ≤ 100)개의 수가 공백으로 구분되어서 주어진다. 입력으로 주어지는 수는 10,000보다 작거나

www.acmicpc.net

 

#include <iostream>
#include <sstream>
#include <vector>

using namespace std;

int main() {
    int T;
    cin >> T;
    cin.ignore(); // enter키로 인해 getline에 입력 방지

    string n, num;
    for (int i = 0; i < T; i++) {
        vector<string> numbers;

        int sum = 0;
        getline(cin, num); // 10 20 30 40 ... 식으로 받아서 getline을 써야함
        stringstream sstream(num); // 토큰화할 문자열
        
        // 스트림에 들어있는 문자열을 공백을 토크나이징하여 n에 저장한다.
        while (getline(sstream, n, ' ')) numbers.push_back(n); 
        for (auto n : numbers) sum += stoi(n);
        cout << sum << endl;
    }
    return 0;
}

 

 

1. stream
stringstream sstream(num);

 

우선 받은 문자열을 stream에 저장한다.

 

 

2. stream에 저장된 문자를 토크나이징하여 n에 저장
 while (getline(sstream, n, ' ')) numbers.push_back(n);

 

토큰 '(공백)'을 기준으로 더 이상 토큰이 없으면 null을 반환한다.

 

getline의 3번째 인자는 원래 아무것도 없으면 '\n'로 인식하여 행 단위로 받고 싶을 때 쓰이지만,

 

위와 같은 방식으로 '(공백)'을 기준으로 끊어받기 때문에 스트림으로부터 문자를 받아 n에 저장해주는 역할을 할 수 있다.