이 글에서는 C++에서 문자열에 포함된 모든 정수를 추출하는 방법을 알아보겠습니다. 숫자와 숫자가 아닌 문자가 섞여 있는 문자열이 주어졌을 때, 그 안의 모든 숫자 값을 추출하는 것이 목표입니다.
이 문제를 해결하기 위해 C++의 stringstream 클래스를 활용합니다. 문자열을 단어 단위로 분리한 뒤, 각 단어를 정수형 데이터로 변환을 시도합니다. 변환이 성공하면 해당 단어는 정수이므로 그 값을 출력하면 됩니다.
입력: 숫자가 포함된 문자열 "Hello 112 World 35 75" 출력: 112 35 75
알고리즘
1단계: 숫자가 포함된 문자열을 입력받는다 2단계: 문자열을 여러 개의 단어로 분리한다 3단계: 단어가 정수형으로 변환 가능하면 해당 값을 출력한다 4단계: 종료한다
예제 코드
#include<iostream>
#include<sstream>
using namespace std;
void getNumberFromString(string s) {
stringstream str_strm;
str_strm << s; // 문자열 s를 stringstream으로 변환
string temp_str;
int temp_int;
while(!str_strm.eof()) {
str_strm >> temp_str; // 단어를 하나씩 temp_str에 저장
if(stringstream(temp_str) >> temp_int) { // 문자열을 int로 변환 시도
cout << temp_int << " ";
}
temp_str = ""; // 임시 문자열 초기화
}
}
main() {
string my_str = "Hello 112 World 35 75";
getNumberFromString(my_str);
}실행 결과
112 35 75
코드 설명
위 코드의 핵심 동작 원리는 다음과 같습니다.
1. stringstream 변환: 입력받은 문자열을 stringstream 객체에 넣으면, 스트림 연산자(>>)를 사용해 공백을 기준으로 단어를 하나씩 읽어올 수 있습니다.
2. 정수 변환 시도: 각 단어를 새로운 stringstream에 넣어 int 타입 변수로 추출을 시도합니다. 만약 단어가 "112"처럼 숫자로만 이루어져 있다면 변환이 성공하고, 조건문이 참이 되어 값을 출력합니다.
3. 실패 시 무시: "Hello"나 "World"처럼 숫자가 아닌 단어는 변환에 실패하므로 자동으로 건너뛰게 됩니다.
이 방법은 별도의 복잡한 파싱 로직 없이 C++ 표준 라이브러리만으로 간단하게 구현할 수 있다는 장점이 있습니다. 다만 음수(-35 등)나 소수점이 포함된 경우에는 추가적인 처리가 필요할 수 있으니, 실무에서는 입력 형식을 고려하여 코드를 확장하는 것이 좋습니다.