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

  • Post author:
  • Post category:其他


先看如下代码

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 版权协议,转载请附上原文出处链接和本声明。