【碎碎念2】关于cin死循环问题

在验证输入合法性时遇到cin导致的死循环问题,通过使用cin.clear()和cin.ignore()未能解决问题。最终解决方法是在代码中加入cin.sync()或者不使用cin.sync()也能避免死循环。参考了相关C++基础知识和STL函数。
摘要由CSDN通过智能技术生成

今天遇到一个题目,要求验证输入的合法性,事故现场如下:

int assum;
cin>>assum;

while(!cin.good())
	{
		cout<<"输入的数据类型不合法,请重新输入"<<endl;
		cin>>assum;
	}

这会出现死循环、无法进行输入的情况。

查阅了很多资料,给出的解决方法基本如下:

while(!cin.good())
	{
		cout<<"输入的数据类型不合法,请重新输入"<<endl;
		cin.clear();
        //cin.ignore()和cin.sync()二选一
        cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
        //需要include<limits>
		//cin.sync();
		cin>>assum;
	}

cin.clear()可以清除错误标志,cin.ignore()可以忽略缓冲区内容直到遇到EOF。

然而我很绝望地发现,它们丝毫不起作用,我的程序依然在死循环。

好在最终我还是解决了这个问题:

while(!(cin>>assum))
	{
	    cout<<"输入的数据类型不合法,请重新输入"<<endl;
		getchar();
		fflush(stdin);
		cin.clear();
		cin.sync();
	}

似乎不写cin.sync()也可以。

参考链接如下:

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值