cin.ignore() 함수는 C++에서 입력 버퍼에 남아 있는 하나 이상의 문자를 무시하거나 제거할 때 사용하는 함수입니다.
ignore() 함수가 실제로 어떻게 동작하는지 이해하려면, 먼저 이 함수 없이는 발생하는 전형적인 문제 상황을 살펴보는 것이 좋습니다.
왜 입력 버퍼를 비워야 할까요?
프로그래밍을 하다 보면 불필요하게 남아 있는 버퍼를 비워야 하는 경우가 있습니다. 그래야 다음 입력이 원하는 변수에 올바르게 저장되고, 이전 변수의 버퍼에 섞여 들어가는 일을 막을 수 있습니다.
예를 들어, cin으로 숫자를 입력받은 직후 문자 배열이나 문자열을 입력받아야 한다고 가정해 봅시다. 이때 입력 버퍼를 비우지 않으면, 첫 번째 입력 후 Enter 키를 누를 때 생성된 개행 문자(\n)가 버퍼에 그대로 남아 있게 됩니다. 이전 변수의 버퍼에 아직 데이터가 남아 있는 상태이기 때문에, 프로그램은 다음 입력 단계를 건너뛰어 버립니다.
문제가 되는 코드 예제
#include<iostream>
#include<vector>
using namespace std;
main() {
int x;
char str[80];
cout << "Enter a number and a string:\n";
cin >> x;
cin.getline(str,80); // 문자열 입력
cout << "You have entered:\n";
cout << x << endl;
cout << str << endl;
}실행 결과
Enter a number and a string: 8 You have entered: 8
코드에는 정수와 문자열을 각각 입력받는 두 개의 cin 문이 존재하지만, 실제 실행 결과를 보면 숫자만 입력받았습니다. 숫자 입력 후 Enter 키를 누르면, getline() 함수가 아무 입력도 받지 못한 채 건너뛰어져 버립니다.
간혹 문자열 입력이 처리되는 것처럼 보일 수도 있지만, 실제로는 정수 변수의 버퍼에 남아 있던 개행 문자가 소비된 것이므로 화면에는 문자열이 출력되지 않습니다.
cin.ignore()로 문제 해결하기
이러한 문제를 해결하려면 cin.ignore() 함수를 사용해야 합니다. 이 함수는 지정한 범위까지의 입력을 무시하는 역할을 합니다. 일반적으로 다음과 같이 작성합니다.
cin.ignore(numeric_limits<streamsize>::max(), '\n')
이 구문의 의미는 다음과 같습니다.
- numeric_limits<streamsize>::max(): 스트림이 담을 수 있는 최대 크기만큼 문자를 무시하라는 의미입니다.
- '\n': 개행 문자를 만나면 무시를 멈추라는 구분자(delimiter)입니다.
즉, 이 한 줄은 새로운 입력을 받기 전에 개행 문자를 포함해 버퍼에 남아 있는 모든 내용을 깨끗이 비워 줍니다.
해결된 코드 예제
#include<iostream>
#include<ios> // 스트림 크기를 얻기 위해 사용
#include<limits> // 숫자 한계값을 얻기 위해 사용
using namespace std;
main() {
int x;
char str[80];
cout << "Enter a number and a string:\n";
cin >> x;
cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 새 입력 전에 버퍼 비우기
cin.getline(str,80); // 문자열 입력
cout << "You have entered:\n";
cout << x << endl;
cout << str << endl;
}실행 결과
Enter a number and a string: 4 Hello World You have entered: 4 Hello World
이제 cin.ignore() 덕분에 숫자 입력 후 남아 있던 개행 문자가 제거되었고, getline()이 정상적으로 문자열을 입력받아 "Hello World"가 올바르게 출력되는 것을 확인할 수 있습니다.
정리
cin >> 연산자로 입력받은 후 getline() 같은 줄 단위 입력 함수를 사용할 때는 반드시 중간에 cin.ignore(numeric_limits<streamsize>::max(), '\n')을 호출하여 입력 버퍼를 비워 주는 것이 좋은 습관입니다. 이는 혼합 입력 상황에서 발생하는 가장 흔한 버그를 예방하는 핵심 기법입니다.