C++
[C++] 숫자가 아닌 다른 값을 입력하는 것이 방지
Muru
2023. 12. 22. 17:56
두 변수의 값을 교환하기 예
#include <iostream>
using namespace std;
void swap(int& ref_A, int& ref_B) {
int temp = ref_A; //복사본 생성
ref_A = ref_B;
ref_B = temp;
}
int main(void)
{
int x, y;
cout << "Enter number: ";
cin >> x;
cout << "Enter number: ";
cin >> y;
//스왑해줄 함수 생성
cout << "Before swap x: " << x << ", y = " << y << endl;
swap(x, y);
cout << "After swap x: " << x << ", y = " << y << endl;
return 0;
}
문제를 풀다가 생각이난, 만약 숫자가아닌 string을 입력하면 어떡하지?
방지를 하고자 한번 만들어봤다.
#include <iostream>
#include <limits>
using namespace std;
void swap(int& ref_A, int& ref_B) {
int temp = ref_A; //복사본 생성
ref_A = ref_B;
ref_B = temp;
}
//사용자가 숫자가 아닌 다른 값을 입력했다면?
void getValidNumber(int& num, const string& prompt) {
while (true) {
cout << prompt;
cin >> num;
//입력이 성공적인가?:
if (cin.fail()) {
//입력 실패시 상태 초기화
cin.clear();
//남아 있는 잘못된 입력 무시
cin.ignore(numeric_limits<streamsize>::max(), '\\n');
cout << "Invalid input. Please enter a number." << endl;
}
else {
break;
}
}
}
int main(void)
{
int x, y;
getValidNumber(x, "Enter number for x: ");
getValidNumber(y, "Enter number for y: ");
//스왑해줄 함수 생성
cout << "Before swap x: " << x << ", y = " << y << endl;
swap(x, y);
cout << "After swap x: " << x << ", y = " << y << endl;
return 0;
}
cin.fail(), cin.clear()
1.cin.fail() 함수는 숫자형 변수에 문자를 넣으려는 코드와 같이 올바르지 않은 시도가 이루어질때 failbit를 사용하여
참(true=1)을 반환시킨다.
매개변수 int& num이므로 다른것이 들어오면 전부 true로 반환해버리는것.
2. cin.clear() 함수는 내부 스트림 상태 플래그를 초기화합니다. 현재 cin.fail()에는 잘못된 값이 들어왔으므로
스트림 오류 상태가 되어있는데, 이것을 다시 사용가능하도록 만드는 것이지요.
//선언해줘야함.
#include <limits>
//이 함수는 스트림에서 지정된 수만큼의 문자를 무시하고 넘어갑니다.
//첫 번째 인자는 무시할 문자의 최대 개수
//두 번째 인자는 무시를 중단할 특정 문자를 지정합니다.
cin.ignore()
//이 부분은 streamsize 타입이 표현할 수 있는 최대값을 나타냅니다.
//여기서 ignore에게 가능한 많은 문자를 무시하라고 지시하는 것입니다.
numeric_limis<streamsize>::max()
//줄바꿈
//cin.ignore()함수는 줄바꿈 문자를 만날때까지 문자를 무시합니다.
'\n'
요약
잘못된 입력이나 불필요한 데이터를 스트림에서 제거해 유효한 입력을 위해 스트림을 정리.
int num;
cout << "Enter an integer: ";
cin >> num;
if (cin.fail()){
cin.clear(); //스트림 실패 상태 초기화
cin.ignore(numeric_limits<streamsize>::max(), '\n'); //잘못된 입력 무시
cout << "Invalid input. Plz enter a valid int. << endl;
}