先看如下代码
void test08()
{
int num;
cout << "请输入一个1到10的数字:" << endl;
while (true)
{
cin >> num;
if (num > 0 && num <= 10)
{
cout << "输入的数字为" << num << endl;
break;
}
cout << "对不起,请重新输入" << endl;
}
}
该程序比较简单,只是单纯的让用户输入0-10的数字,输入正确,就break终止循环,输入错误,就继续等待输入。
test08()运行效果如下
当我输入11,就提示输入错误,一切都在我们预料之中,这时,我输入一个字符a,你会发现奇怪的一幕,效果如下
可以发现,此时程序进入疯狂的循环状态,并没有如最初那样,等待我们输入,这是为什么呢?
原因是这样,cin >> num ,它表示只负责接收int 类型的数字,当我们输入a时,很明显不是它想要的类型,这是cin会做一个操作
,cin会将内部的标志位变为1,当这个标志位变为1之后,它就不会等待我们输入了。通过如下cin.fail()可以打印cin里面的标志位,代码如下
void test08()
{
int num;
cout << "请输入一个1到10的数字:" << endl;
while (true)
{
cin >> num;
if (num > 0 && num <= 10)
{
cout << "输入的数字为" << num << endl;
break;
}
cout << "对不起,请重新输入" << endl;
cout << "标志位: " << cin.fail() << endl;
}
}
运行之后,我们输入数字11,可以发现标志位是0,同时cin会等待我们继续输入
这时,我输入字符a,大家注意看标志位
可以发现标志位变为了1,当它成为1之后,cin将不会再等待我们输入了。
明白了这点之后,我们应该如何解决这个问题呢?
方法很简单,就是重置标志位,将其重新变为0,然后清空输入的缓冲区内容即可,具体代码如下
void test08()
{
int num;
cout << "请输入一个1到10的数字:" << endl;
while (true)
{
cin >> num;
if (num > 0 && num <= 10)
{
cout << "输入的数字为" << num << endl;
break;
}
cout << "对不起,请重新输入" << endl;
cout << "标志位: " << cin.fail() << endl;
重置标志位
cin.clear();
cin.sync(); //清空缓冲区
}
}
现在继续来运行测试,此时我输入一个a,你会发现,cin的标志位被重置为0了,同时cin也正常的在等待我们继续输入正确的数字
版权声明:本文为u010632547原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。