stringstream을 활용하여 문자열 처리하기

들어가기

cpp로 알고리즘 문제를 풀다보면 가끔 까다로운 input으로 시간이 오래 걸릴 경우가 있습니다.

그중 최근 겪었던 까다로운 input을 쉽게 해결하는 방법을 알아보겠습니다.

본론

문자열을 쉽게 핸들링하는 방법으로 stringstream이 있습니다. 이를 활용하여 입력받은 string input을 구분하여 저장할 수 있습니다.

예를 들어 다음과 같은 상황을 고려해보겠습니다.

1
2
3
1 lee 3학년 19살
2 kim 2학년 18살
3 choi 1학년 17살

예시와 같이 3명의 학생이 입력이 됩니다. 하지만 모든 입력은 띄어쓰기를 구분되어 번호, 이름, 학년, 나이가 입력됩니다. 이름과 학년, 나이의 길이 제한은 없습니다.

즉, 이름이 100자인 학생이 들어올수도 있고 나이가 100살인 학생이 들어올수 있습니다.

이럴 경우 단순히 input을 처리하기에는 다소 많은 시간을 들여야 합니다. 이때 유용하게 사용할 수 있는 방법이 바로 stringstream입니다.

이 역시 코드를 보며 확인해 보겠습니다.

#include <iostream>
#include <sstream>
using namespace std;

int main() {
    string input;
    for(int i = 0; i < 3; i ++) {
        getline(cin, input);
        stringstream ss(input);

        string v;
        while((ss >> v)) {
            cout << v << endl;
        }
        cout << endl;
    }
    return 0;
}

일단 입력받은 문자열을 통째로 input에 저장합니다. 이럴 경우 input에 저장되는 값은 아래와 같습니다.

input에 저장된 문자열을 이제 stringstream을 생성하며 문자열을 전달합니다.

이렇게 되면 ss에도 input 값과 같은 문자열이 가지고 있게 됩니다.

stringstream에 저장된 값을 12번 줄에서 보이는 것 같이 내부적으로 다시 string 단위로 뽑아 다음과 같은 출력을 얻을 수 있습니다.

중간에 stringstream을 바꿔야 한다면 다음과 같이 사용하시면 됩니다.

ss.str("바꿔야 할 문자열");

stringstream을 사용하면서 한가지 주의할 점은 바로 값의 type입니다.

코드 예시에서 볼수 있듯이 stringstream에서 연산자를 활용하여 string type의 v에 값을 저장하고 있습니다.

하지만 이 type이 맞지 않는다면 stringstream은 값을 저장하지 않고 바로 종료합니다.

즉, 위와 같은 input이 들어왔을 경우 해당 값을 저장할 변수 type이 int로 설정되어 있다면 출력 n의 바로 앞인 8까지 출력후 종료됩니다.

마무리

이번에 알게된 stringstream을 통해 모든 분들이 예상치 못한 input에 당황하는 일이 줄어들었으면 합니다…

Share