정의
#include <sstream>
sstream 라이브러리로 문자열 파싱 쉽게 할 수 있다.
stringstream
문자열을 파싱할 수 있다
- 공백을 구분한다
- 개행 문자('\n')를 구분한다
입력 | 출력 | ||
변수 | 값 | 변수 | 값 |
str | "abc def\nghi" | ans[0] | "abc" |
ans[1] | "def" | ||
ans[2] | "ghi" |
예시 코드
vector<string> ans;
void parsing(string str) {
stringstream ss;
// 초기화
// ss.str("");
ss.str(str);
string token = "";
while(ss >> token)
ans.push_back(token);
}
istringstream
문자열을 자료형에 맞게 파싱 할 수 있다
- 공백을 구분한다
- 개행 문자('\n')를 구분한다
입력 | 출력 | ||
변수 | 값 | 변수 | 값 |
str | "abc 123" | token | "abc" |
num | 123 |
예시 코드
vector<string> ans;
void parsing(string str) {
istringstream iss;
// 초기화
// iss.str("");
iss.str(str);
int num;
string token = "";
iss >> token >> num;
}
ostringstream
문자열을 자료형에 맞게 병합할 수 있다
입력 | 출력 | ||
변수 | 값 | 변수 | 값 |
str1 | "abc" | ans | "abc 123'\n'def" |
공백 | ' ' | ||
num | 123 | ||
개행 | '\n' | ||
str2 | "def" |
예시 코드
string merge_str(int num, string str1, string str2) {
string ans;
ostringstream oss;
// 초기화
// oss.str("");
oss << str1 << ' ' << num << '\n' << str2;
ans = oss.str();
return ans;
}
구분자 1개 파싱하기
공백이나 개행 이외에 구분자가 1개일 때 사용한다.
- getline은 딱 1개만 구분함
즉, getline이 구분자 이외에 공백이나 개행을 파싱 하지 않음
입력 | 출력 | ||
변수 | 값 | 변수 | 값 |
str | "22:45 30" | ans[0] | "22" |
ans[1] | "45 30" |
예시 코드
vector<string> ans;
void parsing(string str) {
stringstream ss;
// 초기화
// ss.str("");
ss.str(str);
string token = "";
// getline을 이용하여 구분
while(getline(ss, token, ':'))
ans.push_back(token);
}
구분자 다수 파싱하기
#include <regex>
구분자가 여러 개일 때 사용한다
- 정규표현식 regex를 사용
입력 | 출력 | ||
변수 | 값 | 변수 | 값 |
str | "abc;123,def" | ans[0] | "abc" |
pattern | R"((;| |,|-|\.|\.\.))" | ans[1] | "123" |
ans[2] | "def" |
예시 코드
vector<string> ans
vector<string> split(string str, string pattern) {
regex re(pattern);
sregex_token_iterator it(str.begin(), str.end(), re, -1), end;
return vector<string>(it, end);
}
// '|' 으로 구분
// '.' = \.
// '..' = \.\.
ans = split(s, R"((;| |,|-|\.|\.\.))");