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 라이브러리는 문자열을 다루는 다양한 상황에서 매우 유용하게 사용된다.
예를 들어, 사용자 입력 검증, 파일로부터 읽은 데이터의 파싱, 데이터의 문자열로의 변환 및 포매팅 등 다양한 작업을 수행할 때 사용할 수 있다.
또한 문자열과 스트림을 사용하여 복잡한 데이터 처리를 보다 쉽게 구현할 수 있게 도와준다.
예시
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에 저장해주는 역할을 할 수 있다.