본문 바로가기

programming/문제 해결

[C++] 문자열에서 정수, 실수, 문자 추출하기 - (stringstream)

반응형

1. 개요

 

 백준 알고리즘 문제를 풀다가 문자열에서 정수들을 추출해야 하는 경우가 발생했다. 문자열은 질리도록 나를 괴롭혔고 날이 날인지라 정말 극강의 하기 싫음을 느끼고 혹시나 하는 마음에 구글링을 시작했다. 'string 토큰 분리'라는 키워드로 구글링을 해보니 'stringstream' 이라는 클래스가 나오고 나는 바로 이 클래스를 공부하기 시작하였다.

 

2. 이론

 

 stringstream은 문자열에 자신이 원하는 자료를 찾고자 할 때 유용한 클래스이다. 예를 들어 "76 65.7"이라는 문자열이 있을 때 76이라는 정수만 뽑고 싶을 때 stringstream클래스를 사용하면 훨씬 간편하게 구용할 수 있다. 다음 코드들을 보자.

 

3. 예시 코드

 

- 문자열에서 정수 추출하기

 

 백문이 불여일견! 다음 코드를 먼저 보자

 

#include <iostream>
#include <sstream>

using namespace std;

int main(void) {

	int buffInt;
	stringstream ss;
	ss.str("76 65.7");

	ss >> buffInt;
	cout << buffInt << endl;

	return 0;

}

 

 이렇게 되면 실행결과는 다음과 같다.



 문자와 문자열시 섞여있는 문자열에서 정수 하나만이 추출되어 변수에 저장된다. 정수만이 가능할까? 그것은 아니다. 만약 실수도 출력하고 싶으면 다음과 같이 코드를 작성하면 된다.

 

- 문자열에서 실수와 정수 추출하기

 

#include <iostream>
#include <sstream>

using namespace std;

int main(void) {

	int intBuff;
	double doubleBuff;

	stringstream ss;
	ss.str("123 56.7");
	ss >> intBuff >> doubleBuff; 

	cout << intBuff << endl << doubleBuff << endl;


	return 0;

}

 

 자 위의 코드를 보면 정수형 변수 하나와 실수형 변수 하나를 선언하고 stringstream객체에서 값을 추출받았는데 이렇게 간단하게 추출해도 올바른 값이 저장된다. 다음은 실행 결과이다.



 이제 stringstream객체를 strtok처럼 사용할 수 있는 법에 대해 알아보자. while문을 활용하면 간단하다.

 

- stringstream과 while문의 활용

 

#include <iostream>
#include <sstream>

using namespace std;

int main(void) {

	int buffInt;

	stringstream ss;
	ss.str("12+32-98+89+71");

	while (ss >> buffInt)
		cout << buffInt << endl;

	return 0;

}

 

 위의 문자열을 보면 5개의 정수가 존재한다. 만약 strtok였으면 저 음수와 양수에 대한 판단을 해야했겠지만, stringstream클래스를 사용한다면 그럴필요 없다. 다음은 위의 코드의 실행결과이다.



 

반응형