문자열에서 내가 원하는 자료형의 데이터를 추출하는데 유용하다.
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
int main() {
string str = "12 34\n567";
stringstream ss(str);
int num;
while (ss >> num) {
cout << num << ' ';
}
}
// 12 34 567
ss >> num
에서 num이 int 타입이므로 공백 또는 \n 단위로 정수를 추출할 수 있다.
중간에 정수로 추출할 수 없는 문자가 있으면 그 전까지 출력된다.
int main() {
string str = "12 3R4\n567";
stringstream ss(str);
int num;
while (ss >> num) {
cout << num << ' ';
}
}
// 12 3
문자열 단위로 추출한 경우
int main() {
string str = "12 3T4\n567";
stringstream ss(str);
string num;
while (ss >> num) {
cout << num << ' ';
}
}
// 12 3T4 567
char 단위로 추출한 경우
int main() {
string str = "12 3T4\n567";
stringstream ss(str);
char num;
while (ss >> num) {
cout << num << ' ';
}
}
// 1 2 3 T 4 5 6 7
여러 데이터 유형으로 추출한 경우
int main() {
string str = "12 T4\n567";
stringstream ss(str);
int num1;
char ch;
int num2;
string s;
ss >> num1>>ch>>num2>>s;
cout<<num1<<' '<<ch<<' '<<num2<<' '<<s;
}
// 12 T 4 567
get()을 사용하면 커서를 이동하며 다음 char를 가져온다.
unget()을 하면 커서를 앞으로 한 칸 이동한다.
int main() {
string str = "1 2A";
stringstream ss(str);
int num1;
char ch1, ch2, ch3;
num1 = ss.get();
ch1 = ss.get(); // 공백
ch2 = ss.get();
ch3 = ss.get();
cout << num1 << ' ' << ch1 << ' ' << ch2 << ' ' << ch3;
}
// 49 2 A
num1은 1의 아스키코드값인 49가 추출되었고, ch1은 공백, ch2는 2, ch3는 A가 추출된 것을 알 수 있다.
stringstream을 활용할 수 있는 문제이다.
다트를 3번 던졌을 때의 결과가 문자열로 주어지면 점수를 구한다. 입력 형식은 다음과 같다.
점수|보너스|[옵션]
으로 이루어진 문자열 3세트.
예) 1S2D*3T
점수는 0에서 10 사이의 정수이다.
보너스는 S, D, T 중 하나이다. (S는 점수^1, D는 점수^2, T는 점수^3)
옵션은 *이나 # 중 하나이며, 없을 수도 있다. ( *은 해당 점수와 바로 전에 얻은 점수를 각 2배로, #은 해당 점수를 마이너스로 바꾼다)
처음에는 dartResult[i]
처럼 인덱스로 접근해서 풀었고, 이렇게 풀어도 통과된다. AC 받고 다른 사람 풀이를 확인했는데 stringstream으로 풀이한 것이 훨 깔끔해서 내용을 정리해봤다.
#include <string>
#include <sstream>
#include <vector>
using namespace std;
int solution(string dartResult) {
vector<int> vec(3, 0);
int num;
stringstream ss(dartResult);
for (int i = 0; i < 3; i++) {
ss >> num;
char bonus, opt;
bonus = ss.get();
if (bonus == 'D') num *= num;
else if (bonus == 'T') num *= num * num;
vec[i] = num;
opt = ss.get();
if (opt == '*') {
if (i > 0) vec[i - 1] *= 2;
vec[i] *= 2;
} else if (opt == '#') {
vec[i] *= -1;
} else ss.unget();
}
return vec[0] + vec[1] + vec[2];
}