정의

#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"((;| |,|-|\.|\.\.))");