고장난 std::cin

캐모마일·2024년 4월 4일

수업일지

목록 보기
9/9
post-thumbnail

iostream

iostream은 C++에 있는 입출력을 위한 헤더 파일이다.

cin의 정체

그중 입력을 담당하는 것은 std::cin 인데, 이는 istream에 정의된 객체이다.

int a;
cin >> a;

우리는 이러한 코드로 숫자를 입력받을 수 있다.
하지만 정상적인 값이 들어오지 않는 경우도 있을까? 그렇다.
숫자를 입력하세요. 라는 말을 듣지 않는 사용자가 a를 입력하게 되면, cin에는 에러가 발생합니다.

cin의 상태 플래그

에러 발생 여부를 어떻게 확인할 수 있을까요?
그건 바로 cin 내부의 상태 플래그의 값을 확인하는것입니다.
cin 내부의 상태 플래그는 입력을 받을 때 마다 값이 바뀌는데요,

failbit : 입력 실패, 숫자 입력 일 때 문자가 입력된 경우
eofbit : 파일의 끝, 읽을 것이 없다.
badbit : 입력값이 손상되었음, 더 읽을 수 없다.
goodbit : 아무 문제도 없음, 정상

이러한 상태 플래그들로 cin의 에러 여부를 파악할 수 있습니다.

를 통한 에외처리

cin.fail(), cin.eof(), cin.bad(), cin.good()과 같은 멤버함수로 예외처리가 가능하겠죠?

cin이 고장났다!!

그런데 고장난 cin? 이게 무엇일까요?

int를 받고있는 cin이 "안녕하세요"라는 문자를 받게 되면, failbit 플래그가 켜질 것입니다.
그러면 cin은 정상적인 입력 작업을 할 수 없는데요!

그러면 이 고장난 cin을 어떻게 고칠까요?

cin.clear()

그것은 바로 cin.clear()!!

cin.clear() 함수는 입력 스트림의 오류 플래그를 재설정하는 데 사용됩니다.

이를 호출하면 cin의 상태 플래그들이 모두 초기화 되어 정상적으로 돌아옵니다. 만!

cin의 작동방식

cin은 입력을 받으면 값이 입력버퍼에 저장, 이후 버퍼를 읽어 변수 저장으로 진행됩니다.

하지만 집이 무너진 cin

하지만 숫자 저장 중 문자가 들어온, cin.fail 상태에서는 cin.clear()을 통해 상태 플래그를 초기화 하여도, cin 입력 버퍼에는 아직 잘못 들어간 문자가 남아있어서 그것을 읽어 int 변수에 넣으려 하기 때문에 다시 fail 플래그가 켜질 것입니다.

cin의 집을 고쳐보자!

그렇다면 이 입력 버퍼를 비워야 우리가 겪는 문제를 해결하겠죠?
그러기 위해 사용하는 cin.ignore() 가 있습니다.

cin.ignore()

cin.ignore() 함수는 입력 버퍼의 내용을 지우는 데 사용됩니다.

두 개의 인자를 넘겨주어 사용할 수 있는데, streamsize_Countmetadelim이라는 값이 필요합니다. 첫 번째는 읽을 문자의 갯수, 두 번째는 읽으면 끊을 문자입니다.
cin.ignore(1000, '\n')과 같은 코드는, 10개의 문자씩 버리거나 \n을 만나면 버리기.

이런 식으로 입력 버퍼를 비워내면 결국 cin이 정상적으로 돌아오게 됩니다!

0개의 댓글