cin和while配合使用时,可能出现的死循环

先看如下代码

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也正常的在等待我们继续输入正确的数字

 

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值