cin으로 입력을 받던 도중 잘못된 입력이 들어올 경우 문제가 되는 경우가 있다.
이때 한번만 입력을 잘못 받고 끝나면 다행이지만 cin의 버퍼에 잘못 입력된 값이 남아있어서
이후 입력까지 계속 문제가 되곤 한다.
이럴 경우에는 cin의 버퍼를 지워주는 작업이 필요하다.
예를들어 nNumber 라는 int 형 변수에 숫자를 입력 받고자 하는데 문자가 입력되어 자료형이 맞지 않을경우
에러가 발생한다
- int nNumber = -1;
- while (true)
- {
- cin >> nNumber;
- if (cin.fail())
- {
- cout << "error" << endl;
- }
- }
이와 같은 경우 nNumber에 정수형 값이 아닌 다른 값이 들어 올 경우 에러가 발생하고 cin의 에러비트가 활성화 되어
경고 메세지를 출력한다.
하지만 cin의 버퍼에는 여전히 다른 값이 남아있기 때문에 while 문에 의하여 경고메세지를 반복해서 출력한다.
이럴 경우 에러비트를 초기화 해주는 clear() 함수와 버퍼값을 비워주는 ignore() 함수를 사용하면 된다.
clear()는 파라미터 없이 에러비트를 초기화 해 주는 역할을 하며
ignore는 첫번째 파라미터가 입력받을 문자열 길이, 두번째 파라미터가 종료문자이다.
첫번째 파라미터로 입력받은 길이만큼 혹은 두번째 파라미터로 입력받은 종료문자가 들어오면 읽기를 중단하는 역할을 한다.
문자열의 길이는 적당히 충분한 값을 주면 되고, 종료문자로는 일반적으로 개행문자 (\n)을 사용하면 된다.
즉 엔터를 통해 입력이 종료되면 그 시점까지만 입력을 받겠다는 의미가 된다.
두 함수를 추가하여 아래와 같이 사용을 하면 에러 비트초기화와 버퍼 초기화를 통해
반복적인 에러 메세지 출력을 막을 수 있다.
- int nNumber = -1;
- while (true)
- {
- cin >> nNumber;
- if (cin.fail())
- {
- cout << "error" << endl;
- cin.clear();
- cin.ignore(INT_MAX, '\n');
- }
- }
'Programming > C, C++, MFC' 카테고리의 다른 글
cout을 이용할때 출력 정밀도를 제어해 보자 (0) | 2018.07.26 |
---|---|
메모리 동적할당 예시 (0) | 2018.04.18 |
'제약 조건과 일치하는 올바른 내보내기를 찾을 수 없습니다' 해결방법 (0) | 2017.10.16 |
프로그램 배포시 아이콘과 MFC dll 관련 설정 (0) | 2017.06.08 |
class를 포함한 dll 만들기 ( 클래스 동적 라이브러리 ) (1) | 2016.05.17 |