안 쓰던 블로그

C++ getline() string을 vector에 나누어 담기 (2자리 이상 숫자 쪼개짐 문제 해결) 본문

알고리즘/알고리즘 문제 풀이

C++ getline() string을 vector에 나누어 담기 (2자리 이상 숫자 쪼개짐 문제 해결)

proqk 2021. 12. 2. 16:35
반응형
1 2 3 4 B B 42 B F F

다음과 같이 공백과 숫자(1<=n<=99), 문자가 입력으로 주어졌을 때, 제대로 입력 받는 방법

 

일단 공백이 있으므로 cin대신 getline()을 쓴다.

그러면 이렇게 출력된다.

string s;
getline(cin, s);

cout << s << endl;
//1 2 3 4 B B 42 B F F

for (int i = 0;i < s.size();i++) {
	cout << s[i] << " ";
}
//1 2 3 4 B B 4 2 B F F

문제는.. 이것은 내가 원하는 출력이 아니다.

getline()은 42처럼 2자리 이상의 숫자까지 하나씩 나눠버리는 문제가 있다.

 

이것을 해결하기 위해 여러 방법을 찾아 보았는데 stringstream이 가장 간결했다.

사용 방법은 아래와 같다.

#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include <sstream>
using namespace std;

int main() {
	string s;
	getline(cin, s); //공백 포함한 1줄 입력

	stringstream ss(s);
	string token;
	vector<string> num;

	while (getline(ss, token, ' ')) {
		if (token != "") {
			num.push_back(token);
		}
	}

	for(auto x: num){
		cout << x << endl;
	}
}

 

getline으로 받은 string을 stringstream으로 나누어 주고,

나눈 문자열을 공백을 기준으로 다시 getline()하며, 한 단어씩 vector에 담는다.

 

이후 string vector를 가지고 원하는 것을 하면 된다.

    //for(int i=0;i<s.size();i++){
    //	cout<<s[i]<<" ";
    //}
    for(auto x: num){
		cout << x << endl;
		if (x == "B") {
			cout << "B" << endl;
		}
		else if (x == "F") {
			cout << "F" << endl;
		}
	}

참고로 나는 이거처럼 숫자면 출력, B면 B출력, F면 F를 출력하는 간단한 코드를 돌리고 싶었던 건데,

위에 주석같이 배열처럼 접근하면 왠진 모르겠지만 디버그 에러라는 것이 떴다.

일단 auto를 쓴 for문을 돌렸더니 해결되었다..

찝찝하지만; 뭔가 해결.

 

 

 

추가로 참고하면 좋은 글: https://eclipse360.tistory.com/97

반응형
Comments