오늘은 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가 원하는 문자인지 확인하는 과정이 필요하다. (파싱 확인)
'코딩 > C, C++' 카테고리의 다른 글
[C++] vector 기본 문법 및 명령어 (0) | 2024.03.22 |
---|---|
[C++] 포인터 call by reference, new 연산자 (0) | 2024.03.20 |
C언어로 게임 만들기(7) - 완성. (코드, 구현 영상) (0) | 2023.06.02 |
C언어로 게임 만들기(5) - 게임 씬 추가(getch함수, exit함수) (0) | 2023.05.28 |
C언어로 게임 만들기(4) - 적 구현(rand함수, srand함수, time함수) (1) | 2023.05.20 |