关于C++的cin的错误输入的问题以及解决办法

最近学校期末用C++做一个实训项目,在用到cin获得用户输入的时候考虑到用户输入的不确定性,要规范cin返回的值,否则会造成意想不到的结果。

先来一个简单的例子:

int num_input;
cin>>num_input;
while(num_input<=0)
{
	cout<<"请输入正数"<<endl;
	cin>>num_input;
}
cout<<num_input<<endl;

这串看起来很平常的代码,当我们随便输入一个字符时,便会陷入死循环,一直重复打印"请输入正数"。
出现这种结果的原因是错误输入使cin进入了一种错误的状态(此时cin会返回0),在这种情况下程序会持续输出cout后面的字符串并忽略后面的cin语句。

之前在网上找到一种解决办法是:

int num_input;
cin>>num_input
while(cin.fail())
{      
	string num_input_string;
	cin.clear();
	cin>>num_input_string;
	cout<<"输入的"<<num_input_string<<"不是数字,重新输入"<<endl;
}

cin.fail()是判断cin的状态的,如果cin为错误状态则返回1,正常状态则返回0
cin.clear()作用是清除cin的错误状态

这里如果错误输入,则用一个string类来接收输入缓冲区中的内容,之后再重新输入。
这个解决方法针对错误输入字符可行,但如果输入的数字超过int的最大值时则不能应对。

因此有以下更好的解决办法:

	int num_input;    
	cin >> num_input;	
	while(cin.fail())
	{
		cin.clear();
		cin.ignore();
		cout << "输入错误,请重新输入"<<endl;
		cin >> num_input;
	}

cin.ignore()作用是忽略掉缓冲区的内容,直到遇到EOF为止

这里如果cin错误,先将cin的错误状态清除,再将输入缓冲区的内容忽略掉,最后再重新输入。
这个方法不仅可以用于防止输入字符陷入死循环,也可以防止输入过大的数而导致错误。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值