cin.fail()과 cin.clear()
- cin.fail() : 숫자형 변수에 문자를 넣으려는 잘못된 시도를 할 경우 failbit 설정 --> 참(1) 반환
- cin.clear() : 내부상태플래그 초기화 --> cin이 올바른 동작을 이어가도록 함
- 정상적으로 값이 입력 되었는지 확인하기 위해 cin 객체의 내부 상태 플래그를 참조함
- 아래 에러가 발생했는지 확인하는 방법 : cin의 fail(), eof(), bad(), good() 멤버함수 사용
failbit : 입력 실패. ex) 정수를 입력받아야하는데 문자를 입력하면 1이 됨
eofbit : 파일의 끝. ex) 더 이상 읽을 문자가 없는 경우 에러
badbit : 스트림 물리적 손상. ex) 더 이상 읽을 수 없어 에러 반환
goodbit : 위의 에러들 발생하지 X. ex) 이 경우 0 반환
- 정수형 변수 a에 정수를 입력했을 때에는 goodbit가 반환되어 오류가 발생하지 않았지만, 문자를 입력하면 cin.fail() 함수의 반환값이 '참'이므로 조건문에 걸리는 것을 볼 수 있음.
- 이후에 cin.clear()를 사용하여 내부플래그 초기화
- cin.ignore()를 사용하여 입력버퍼를 비워줌
#include <iostream>
using namespace std;
int main()
{
int a;
while (true)
{
cin >> a;
if (cin.fail())
{
cout << "비정상 입력!" << endl;
cin.clear();
cin.ignore(5, '\n');
}
}
}
cin.ignore()
- 위의 코드에서 사용한 cin.ignore()에 대해 설명 시작!
- cin.ignore()는 버퍼를 비우기 위한 것!
- cin.ignore(5, '\n')
- 첫번째 인자 : 읽어들일 문자의 갯수 --> 그래서 보통 어느 정도 큰 숫자를 적는다고 함
- 두번째 인자 : 읽으들이면 종료할 문자
- (ignore 함수는 C언의 fflush(stdin)과 비슷)
- 5개 문자를 읽으라고 설정했기 때문에 길이가 5를 넘어가면 비워도 버퍼에 문자가 남아있음
- 그래서 1번 더 실행됨!!
'C++' 카테고리의 다른 글
[C++] 주요 vector 함수 (0) | 2025.05.06 |
---|---|
[C++] array 객체와 vector 객체 (0) | 2025.05.06 |
[C++] 파일 입출력 (.txt 파일) (0) | 2025.05.05 |
[C++] 문자열 | string을 전달인자로 하는 함수 (0) | 2025.05.02 |
[C++] 데이터 형변환 (0) | 2025.05.02 |