본문 바로가기
코딩/C, C++

[C++] 문자열을 정수로 바꾸기, 문자열 파싱하기 (stringstream, sstream)

by JuBro 2024. 3. 24.

오늘은 C++의 stringstream에 대해서 알아보겠습니다.

C++로 코딩을 하다보면, 한 문자열을 파싱하는 경우, 또 한 문자열에서 특정 데이터타입을 추출해야하는 경우가 있습니다.

이때 sstream은 아주 유용한 라이브러리 입니다.

 

#include <sstream>

우선, sstream을 불러와야합니다.

 

 

데이터 타입 추출(변환)

다음은 정수가 공백" " 으로 구분된 문자열을 정수형태 데이터로 추출하는 예시이다.

#include <iostream>
#include <sstream>
#include <string>
#include <vector>

int main() {
    std::string input_string = "10 20 30 40 50";

    std::stringstream ss(input_string);

    std::vector<int> numbers;

    int num;

    while (ss >> num) {
        numbers.push_back(num);
    }

    std::cout << "추출된 정수: ";
    for (int n : numbers) {
        std::cout << n << " ";
    }
    std::cout << std::endl; //10, 20, 30, 40, 50

    return 0;
}

string stream은 공백" " 이나 줄바꿈"\n" 기준으로 알아서 파싱을 해주는데, 이를 int vector에 바로 넣음으로써 문자열을 바로 정수형 데이터로 다룰 수 있습니다. 

 

 

문자열 파싱

구분자(delimiter)를 다른것으로 바꾸면, 문자열을 파싱하기 좋다

다음은, 하이픈 ' - ' 으로 연결된 날짜 문자열을 파싱하는 예시이다.

#include <iostream>
#include <sstream>
#include <string>

int main() {
    std::string date_str = "2024-3-15";

    std::stringstream ss(date_str);

    int year, month, day;

    // 구분자 설정
    char delimiter='-';
    ss >> year >> delimiter >> month >> delimiter >> day;
    
    //제대로 파싱된건지 확인하기!!
    if (ss.fail() || ss.bad() || delimiter != '-') {
        std::cerr << "Error: 파싱 오류" << std::endl;
        return 1;
    }

    // 다시 출력하기 
    std::cout << "Year: " << year << "\nMonth: " << month << "\nDay: " << day << std::endl;

    return 0;
}

다음과 같이 결과가 나오는데,

 stringstream에서는 구분자에 대해서 엄격한 확인을 안해줘서, 이후 delimiter가 원하는 문자인지 확인하는 과정이 필요하다. (파싱 확인)