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;
}