C++/C++

길이가 일정하지 않은 문자열 다루기 stringstream

Elan 2021. 3. 13. 15:26

특정한 형식을 가진 문자열 데이터를 입/출력하는 경우 여러가지로 복잡한 경우가 많다.

 

예를 들면 아래와 같은 형식의 테이블과 연관된 문자열이라고 가정하자.

UID User_ID Name Date of birth Score
1 1234 Gilbert 2021-03-13 5000

공백 단위로 문자를 나누고 이것저것 해야할게 많다.

하지만 stringstream을 이용하면 아래와 같이 간단하게 해결 가능하다.

#include <sstream>

int main(){

	std::string input;
	int numOfRows = 0;
	scanf_s("%d", &numOfRows);
	for (int i = 0; i < numOfRows; i++) {
		getline(cin, input);
		stringstream ss(input);

		std::string str;
        // 요구에 맞춰 정의하면 됨
		while ((ss >> str)) { // operator '>>' 를 반대로 '<<' 로 입력하면 무한루프에 빠지므로 주의
			std::cout << str << std::endl;
		}
		std::cout << std::endl;
	}

	return 0;
}
 

 

만약 아래와 같이 여러 행을 한번에 입력하고 싶다면 어떻게 해야할까?

UID User_ID Name Date of birth Score
1 1234 Gilber 2021-03-13 5000
2 2345 Elan 2011-05-05 4000
3 3456 Maria 2019-04-04 5500

 

아래와 같이 Row별로 내용을 입력해주면 된다

콘솔 입력

#include <sstream>
#include <iostream>
int main() {

	std::string input;
	int numOfRows = 0;
	int numOfColumns = 0;
	std::cout << "입력할 Row 갯수 : ";
	scanf_s("%d", &numOfRows); // 입력할 데이터 Row 갯수
	std::cout << "입력할 Column 갯수 : ";
	scanf_s("%d", &numOfColumns); // 입력할 데이터 Column 갯수
	while (getchar() != '\n');
	stringstream ss;
	for (int i = 0; i < numOfRows; i++) {
		std::cout << "Row 내용을 입력하세요 : ";
		getline(cin, input);
		//ss.str(input);//stringstream내용을 input으로 변경
		ss << input << ' '; // stringstream에 input 내용 추가 (개행 문자가 들어가지 않기 때문에 마지막 단어에 띄어쓰기가 없었다면 넣어주어야 한다)
	}

	// stringstream에서 한단어씩 전체 출력
	std::cout << "\n\n데이터 출력\n\n";
	for (size_t i = 0; i < numOfRows; i++)
	{
		for (size_t j = 0; j < numOfColumns; j++)
		{
			ss >> input;  // operator '>>' 를 반대로 '<<' 로 입력하면 무한루프에 빠지므로 주의
			std::cout << input <<' ';
		}
		std::cout << '\n';
	}

	return 0;
}