关闭

处理C++中的错误输入类型导致的无限输入bug

标签: bugC++cin
709人阅读 评论(2) 收藏 举报
分类:

开头声明,此文章只对于新手,因为有经验的人可以用很多种方法去避免或者处理这种错误。

cin是一个常用的输入方式,具体不介绍,语文不太好。

有的时候我们在使用cin的时候并不会对输入者的输入进行考究,所以如果有的时候输入者输入错误的类型会导致一些bug,比如下面。

#include "iostream"
using namespace std;
int main(int argc, char const *argv[])
{
	int a=0;
	while(a<=0)
	{
		cin>>a;
		cout<<a;
	}
	return 0;
}
当这个程序运行后,如果你输入的是一个字符会怎么样?



后面的输入全都不用你来干了,这时你也许会想,那我后面接个cin>>(char)怎么样?

#include "iostream"
using namespace std;
int main(int argc, char const *argv[])
{
	int a=0;
	char c=' ';
	while(a<=0)
	{
		cin>>a;
		cin>>c;
		cout<<a<<'\t'<<c<<endl;
	}
	return 0;
}


结果依旧没什么用处,具体原因是什么呢?

让我们先来看看几个概念:

ios::badbit 001 输入(输出)流出现致命错误,不可挽回  

ios::eofbit 010 已经到达文件尾

ios::failbit 100 输入(输出)流出现非致命错误,可挽回

ios::goodbit 000 流状态完全正常, 各异常标志位都为0

 具体相关说明:点击打开链接

我个人的理解和某位百度的先生一样:

就一般说来,badbit是一些系统底层或者硬件出错,比如文件系统错误,磁盘错误,网络错误等等。failbit就是其他软件错误,如试图从不能解析为整数的字符串里想要读一个整数等,顺便说下eof也会造成failbit被置位。
出错之后(不管是可挽回还是不可挽回)的结果是,之后的io操作统统不执行,因为这些操作都会有个if语句先判断这些错误位,如果被置位就直接返回了。
出错后可以用clear方法清除这些错误位,然后继续io。如果错误没有排除,那么结果就是相应的位又被置位了。
所以对于上面的错误,只要用clear()与ignore()就行了。

#include "iostream"
using namespace std;
int main(int argc, char const *argv[])
{
	int a=0;
	char c=' ';
	while(a<=0)
	{
		cout<<"Please input a:";
		cin>>a;
		cout<<"please input c:";
		cin>>c;
		cout<<endl;
		cin.clear();
		cin.ignore();
		cout<<"a:"<<a<<'\t'<<"c:"<<c<<endl;
	}
	return 0;
}

最后是这个样子。





2
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:2046次
    • 积分:85
    • 等级:
    • 排名:千里之外
    • 原创:6篇
    • 转载:0篇
    • 译文:0篇
    • 评论:2条
    文章分类
    文章存档
    最新评论