[C++] 입력 받기

은개·2025년 7월 25일
0

공백을 포함한 문자열 입력 받기

getline()

입력 방식
getline() 함수는 개행 문자('\n')를 만날 때까지 한 줄 전체를 읽음 (공백 포함)

버퍼 처리
개행 문자를 읽어서 폐기하므로, 입력 버퍼를 깨끗이 비웁니다2.

getline() 함수의 두 가지 형태

/*  cin.getline(): char* 형의 문자열을 받을 때 사용 */
cin.getline(char배열, 크기);

/*  getline(cin, string변수): string 형의 문자열을 받을 때 사용 */
getline(cin, string변수);

⚠️ 주의사항
cin과 getline()을 함께 사용할 때, cin 사용 후 getline()을 호출하면 버퍼에 남아있는 개행 문자로 인해 문제가 발생할 수 있음
이 경우 cin.ignore()를 사용하여 버퍼를 비워주는 것이 좋음



공백 & 줄바꿈으로 구분된 2차원 정수 입력 받기

배열의 크기를 알고 있는 경우

const int MAX_ROW = 5;
const int MAX_COL = 4;
vector<vector<int>> participant(MAX_ROW, vector<int>(MAX_COL, 0));
    
for (int i = 0; i < MAX_ROW; i++) {
	for (int j = 0; j < MAX_COL; j++) {
		cin >> participant[i][j];
	}
}


띄어쓰기로 구분된 정수 입력을 배열에 각각 저장하기

1. cin과 istream_iterator 활용

vector<int> numbers(istream_iterator<int>(cin), {});
  • 배열명()
    : vector의 생성자 호출
    • 첫 번째 인자: 시작 반복자
      두 번째 인자: 종료 반복자
    • 인자로 주어진 범위의 데이터를 복사하여 저장
  • istream_iterator<int>(cin)
    : 입력 스트림(cin)에서 정수를 하나씩 읽는 반복자
  • {} (== 기본값인 istream_iterator<int>())
    : 입력의 끝(EOF)을 나타내는 반복자
  • include <iterator>, <sstream> 필요

💡

  • 위 방법은 EOF를 만날 때까지 계속 입력을 받기 때문에 VScode에서는 0 1 2 2 2 7 이런 식으로 입력하고 엔터 쳐도 계속 입력이 받아졌는데, 백준 입력이 EOF로 끝날 수도 있기 때문에 정답 처리됨

C++ EOF 처리 방법

#include <iostream>
using namespace std;
int main() {
  vector<int> numbers;
  int num;
  while (cin >> num) {  // EOF가 입력되면 루프 종료
      numbers.push_back(num);
  }
  return 0;
}

2. getline()과 stringstream() 활용

  • 한 줄을 통째로 입력 받고 공백을 기준으로 정수를 추출
  int main() {
    vector<int> numbers;
    string input;

    // 한 줄 전체 입력받기
    getline(cin, input);
    stringstream ss(input);

    int num;
    while (ss >> num) {
        numbers.push_back(num);  // 정수를 벡터에 추가
    }
    return 0;
}

0개의 댓글