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;
}