관리 메뉴

History

[C++] 표준 입력 스트림에서 입력 오류 처리하는 방법 본문

C,C++/개념 실습 프로그래밍

[C++] 표준 입력 스트림에서 입력 오류 처리하는 방법

luckybee 2022. 10. 26. 17:02
728x90
반응형

c++은 사용자에게 입력을 받을 때 cin객체를 이용하여 입력을 받는다.

#include <iostream>

using namespace std;

int main()
{
    int data = 0;
    cout << "정수 입력:";
    cin >> data;                   //입력
    cout << "data: "<<data<<endl;  //출력
}

 

더보기

정수 입력:5
data: 5

결과는 위와 같다. 그러나 정수가 아니라 문자열을 입력하게 된다면 결과는 아래와 같다.

더보기

정수 입력:asd
data: 0

이렇게 0으로 출력이 된 이유는 자료형 때문이다. 현재 필자가 입력한 data의 자료형은 int 이기 때문에 문자열을 입력하면 cin객체에서 입력 실패로 인식한다. 그래서 어떠한 값도 입력되지 않았기에 data가 가지고 있던 초기값으로 출력이 된 것이다.

 

그래서 c++은 사용자가 입력에 성공했는지 확인할 수 있도록 fail이라는 함수를 제공한다. 이 함수는 성공하면 반환 값이 0 실패하면 반환 값을 1로 반환한다. 이제 fail함수를 이용하여 코드를 재 작성해보겠다. 코드는 아래와 같다.

 

#include <iostream>

using namespace std;

int main()
{
    int data = 0;
    cout << "정수 입력:";
    cin >> data;
    if (!cin.fail()){   //성공하면 반환 값이 0이기 때문에 !를 사용해서 1로 바꾼다.
        cout << "data: " << data << endl;
    }else{
        cout << "값 오류";
    }
}
더보기

정수 입력:asd
값 오류

값이 정상적으로 출력되었다. 그러면 이제 사용자가 제대로 입력할 때까지 반복하는 코드로 수정해보겠다.

코드는 아래와 같다.

#include <iostream>

using namespace std;

int main()
{
    int data = 0;
    cout << "정수 입력:";
    cin >> data;
    while (cin.fail()){
        cout << "값 오류" << endl;
        cin.clear();            //오류 상태 값을 초기화
        cin.ignore(100, '\n');  //100개의 입력값을 무효화
        cin >> data;

	}
	cout << "data: " << data << endl;
  
}

사용자가 문자열을 입력하면 입력 스트림 버퍼에 그대로 남아 있어서 cin.ignore함수로 잘못된 값을 입력 스트림 버퍼를 없애준다. 결과는 아래와 같다.

더보기

정수 입력:asd
값 오류
asdasd
값 오류
asdasdasd
값 오류
2
data: 2

 

728x90
반응형
Comments