C++에서 입력 오류 발생 시 cin 상태 문제
C++에서 cin은 사용자로부터 입력을 받을 때 사용하는 표준 입력 스트림입니다. 그런데 프로그램 실행 중 다양한 이유로 인해 cin 내부에 오류 플래그(error flag)가 설정되는 경우가 있습니다.
예를 들어, 숫자를 입력받아야 하는데 문자가 입력되면 failbit 같은 오류 플래그가 설정됩니다. 오류 플래그가 설정된 상태의 cin은 더 이상 어떤 입력도 정상적으로 받지 못하거나, 입력 버퍼에 남아 있는 잘못된 문자들을 그대로 읽어버리는 문제가 발생합니다.
cin.clear()의 역할
cin.clear() 함수는 이러한 오류 플래그들을 초기화(reset)하여 스트림을 다시 정상 상태로 되돌려 줍니다. 오류 상태가 해제되면 그 후에 getline(), get() 등의 입력 함수들을 정상적으로 사용할 수 있게 됩니다.
cin.clear(); // 오류 플래그 초기화
다만 주의할 점은, clear()는 오류 상태만 지울 뿐 입력 버퍼에 남아 있는 잘못된 데이터까지 제거하지는 않습니다. 바로 이 부분에서 ignore() 함수가 필요합니다.
cin.ignore()의 역할
cin.ignore()는 입력 버퍼에서 특정 개수만큼의 문자를 건너뛰거나, 지정한 구분 문자(delimiter)를 만날 때까지 문자를 무시하는 스트림 입력 함수입니다. 일반적으로 다음과 같이 사용합니다.
cin.ignore(1000, '\n');
위 코드의 의미는 다음과 같습니다.
- 최대 1000개의 문자를 건너뜁니다.
- 단, 그 전에 개행 문자(
'\n')를 만나면 거기서 멈춥니다.
즉, 현재 줄에 남아 있는 나머지 문자들을 모두 버리고 새로운 입력을 깨끗한 상태로 받을 수 있도록 준비해 주는 것입니다.
실제 활용 예시
잘못된 입력이 들어왔을 때 두 함수를 함께 사용하는 전형적인 패턴은 아래와 같습니다.
int num;if (!(std::cin >> num)) {
std::cin.clear(); // 오류 플래그 초기화
std::cin.ignore(1000, '\n'); // 버퍼의 잘못된 입력 제거
}
이처럼 cin.clear()로 스트림의 오류 상태를 복구하고, cin.ignore()로 버퍼에 남은 불필요한 문자를 제거하면, 이후 getline()이나 반복 입력 처리가 안정적으로 동작합니다. 두 함수는 짝으로 함께 사용되는 경우가 많으므로 함께 기억해 두는 것이 좋습니다.