int类型读入非数值数据后异常产生原因及简单解决方法。

int类型读入非数值数据后异常产生原因及简单解决方法。

当一个int类型的变量读入一个非int类型的数值时,比如char,汉字等,此时cin会被锁住,且之前输入的错误内容会保留在缓存区中,此时若不加处理,不仅会导致该int类型数据值未改变,还会导致cin的功能异常,例如下面这个例子:

cout << "1.用户登录    2.管理员登录    3.注册用户账号    4.注销" << endl;
cout << "请选择:";
int key;
cin >> key;
while (key != 1 && key != 2 && key != 3 && key!=4)
{
	cout << "输入错误,请重新输入:";
	cin >> key;
}

此时若输入一个非int类的值,会产生死循环。
在这里插入图片描述
读者可能好奇,明明我已经加了cin,为什么这个循环不会停下来让我输入?这个就是因为cin已经被"锁上"了.

那么应该怎么办呢?
其实很简单,清空缓存区,打开cin。
1.清空缓存
这里首先给大家推荐一个blog:
链接:link(点击蓝色区域)
我们采用的是这篇文章中推荐的最简单的方式。

void Clear_buffer()
{
	int count = 0;
	char c;
	while ((c = getchar()) != '\n');
	return;
}

为什么要清除掉缓存呢?因为缓存在之前没有被吃掉,所以只要错误的输入还在缓存,cin就会被一直锁着。
下面解锁cin
这里直接使用库函数

#include<iostream>
cin.clear();					

这样之后,cin就会被解锁,错误输出也就会被清除了

下面是更改后的例子

cout << "1.用户登录    2.管理员登录    3.注册用户账号    4.注销" << endl;
	cout << "***********************************************************" << endl;
	cout << "请选择:";
	int key;
	cin >> key;
	while (key != 1 && key != 2 && key != 3 && key!=4)
	{
		cout << "输入错误,请重新输入:";
		Clear_buffer();//claer the buffer
		cin.clear();//dislock the cin
		cin >> key;
	}

展示一波效果
在这里插入图片描述
我们之所以要解决掉这个问题,是为了提高鲁棒性,不然很有可能一个错误的输入导致整个程序瘫痪。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值