알고리즘

C++ / cin과 getline의 차이, 그리고 cin.ignore()의 필요성

doyyy_0 2024. 9. 28. 10:40

cin과 getline의 차이, 그리고 cin.ignore()의 필요성

C++에서 입력을 받을 때, 우리는 주로 cin과 getline을 사용합니다. 하지만 이 두 입력 방식에는 중요한 차이가 있으며, 함께 사용할 때 발생하는 문제를 해결하기 위해 cin.ignore()가 필요할 때도 있습니다. 이번 글에서는 cin, getline의 차이와 cin.ignore()의 사용 이유에 대해 정리해보겠습니다.

 

1. cin과 getline의 차이점

1) cin

  • cin은 공백을 기준으로 데이터를 입력받습니다. 즉, 공백(스페이스, 탭, 개행 문자)을 기준으로 하나의 단어만 받아옵니다.
  • 예를 들어, 아래와 같이 사용하면:
    string s;
    cin >> s;
  • 사용자가 "Hello, World!"라고 입력했을 때, s에는 "Hello,"만 저장됩니다. 공백 이후의 "World!"는 입력에서 제외됩니다.

 

2) getline

  • getline은 공백을 포함하여 한 줄 전체를 입력받습니다. 즉, 개행 문자 \n이 나올 때까지 모든 입력을 받아옵니다.
  • 예를 들어:
string s;
getline(cin, s);
  • 위 코드에서 사용자가 "Hello, World!"라고 입력하면, s에는 "Hello, World!"가 그대로 저장됩니다.

차이점 요약:

  • cin: 공백 단위로 나눠 입력받으며, 한 번에 하나의 단어만 저장.
  • getline: 공백을 포함한 한 줄 전체를 저장.

2. cin.ignore()의 필요성

1) 문제의 발생 원인

cin과 getline을 함께 사용할 때 문제가 발생할 수 있습니다. 예를 들어, 정수를 입력받기 위해 cin >> n;을 사용하고, 이어서 한 줄 전체의 입력을 받고 싶을 때 getline()을 사용하면, getline이 빈 값을 반환하는 문제가 발생할 수 있습니다.

int n;
cin >> n;          // 정수 입력
string s;
getline(cin, s);   // 빈 문자열을 받음

 

이 문제는 cin >> n; 이후에 남은 개행 문자(\n) 때문입니다. cin >>는 정수만 읽고 나머지 개행 문자를 입력 버퍼에 남기는데, getline은 이 남아 있는 개행 문자를 읽어 빈 문자열을 반환합니다.

2) 해결 방법: cin.ignore()

이 문제를 해결하기 위해 **cin.ignore()**를 사용하여 남은 개행 문자를 버릴 수 있습니다. cin.ignore()는 입력 버퍼에 남아 있는 문자를 무시하는 역할을 합니다.

int n;
cin >> n;          // 정수 입력
cin.ignore();      // 남아 있는 개행 문자 제거
string s;
getline(cin, s);   // 이제 제대로 한 줄 입력 가능

 

이제 getline은 정상적으로 한 줄 전체의 입력을 받습니다.


3. cin.ignore() 사용법

string s;
cin.ignore();

4. 요약

  1. cin: 공백을 기준으로 데이터를 나누어 입력받으며, 한 단어만 저장.
  2. getline: 공백을 포함해 한 줄 전체를 입력받음.
  3. cin.ignore(): cin >>와 getline을 연속으로 사용할 때, 입력 버퍼에 남은 개행 문자를 무시하기 위해 사용.

cin과 getline을 함께 사용할 때 발생할 수 있는 문제를 방지하려면, cin.ignore()를 적절히 사용하는 것이 중요합니다.