c++ 문자열 자르기 (with. stringstream)

rivermt·2023년 4월 9일
0

cpp

목록 보기
1/1

주로 프로그래머스에서 문제를 풀다보면 BOJ와 다르게 입력을 따로 받는 것이 아니라 주어질 입력들이 vector에 담겨져 있어서 이것을 split해야 하는 경우가 많다.
매번 문제를 접할 때마다 찾아보고 하는게 지겨워서 이번 기회에 기록하려고 한다.

Dash 에서 레퍼런스를 검색해봤다. ios관련 헤더들을 상속받고 있음을 알 수 있었다.

그럼 예제를 한 번 살펴보자.
다음과 같은 string 문자열로 이루어진 vector가 있다고 가정해보자

vector<string> vec = {"A 1", "B 2", "C 3"};

앞의 문자를 key로 뒤의 숫자를 value로 가지게끔 map 자료구조로 저장하고 싶다면 다음과 같이 코드를 작성하면 된다.

	map<string, int> mp;
	for(string s : vec) {
		string key;
    	int val;
    	stringstream ss(s);
        
	    ss << key << val;
    	mp[key] = val;
	}

다음과 같이 작성할 수도 있다.

    for(string s : vec) {
        string key;
        int val;
        stringstream ss(s);
        
        while(getline(ss, key, ' ') && ss >> val) {
            mp[key] = val;
        }
    }
    
// 출력내용
A 1
B 2
C 3

문자열을 공백을 기준으로 분리하기 위해 stringstream을 사용한다.

우선 객체 ss에 문자열을 초기화 한다.

 stringstream ss(s);

getline(ss, key, ',')ss에서 쉼표를 기준으로 문자열을 자르고, key에 저장한다. ss >> valuess에서 다음 정수를 읽고, val에 저장한다.

 while(getline(ss, key, ' ') && ss >> val)

다음은 다른 쉼표를 구분자로하는 다른 예제이다.
string str = "A,B,C";

A, B, C를 각각 배열에 따로 저장하려면 다음과 같이 코드를 작성한다.

	stringstream ss(str);
    string token;
    
    vector<string>tokens;
    
    while(getline(ss, token, ',')) {
        tokens.push_back(token);
    }
    
    // 출력내용
    A
    B
    C
profile
화이팅!!

0개의 댓글