欢迎来到天天文库
浏览记录
ID:38581890
大小:62.00 KB
页数:10页
时间:2019-06-15
《cin读取失败后进入死循环》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、cin读取失败后进入死循环?-------剖析输入流的条件考虑如下代码: #include using namespace std;int main(){ int a; while(cout<<"input a integer (1- 10) :",cin>>a,! (a>=1 && a<=10)) cout<<"try again!"<2、,程序会正确的执行,并且提示用户重新输入。但是如果用户错误的输入了一个字符char,那么,后果就是一直执行while循环!错误分析:当cin尝试将输入的字符读为int型数据失败后,会产生一个错误状态--cin.fail().而要用cin读取输入流中的数据,输入流必须处于无错误状态。因此,由于错误状态的存在,会一直执行while循环。错误修正:#includeusingnamespacestd;intmain(){inta;while(cout<<"inputainteger(1-10):",3、cin>>a,!(a>=1&&a<=10)4、5、cin.fail()){ cout<<"tryagain!"<6、存,下次在读取数据的时候又会再次产生错误,也会陷入死循环。cin输入流错误2010-09-0621:38事先声明,这个帖子不是我写的,不过,这点知识我觉得比较重要,转来了呵呵大家可以配合这个帖子学习一下这方面这是我搜集的相关的输入流异常处理知识(感兴趣的友友可以看看哈):很多初学者都认为cin函数是一个很简单的函数,其实不然!cin函数有很多需要了解的知识(比如:cin的返回值是什么,cin提供了哪些成员函数且分别是什么作用,如cin.clear(),cin.ignore(),cin.fail(),cin.go7、od()等等),如果没有很好的掌握,在使用的时候很可能会出问题却不知其原因!而且很多人也确确实实遇到过不少问题,以下是几个简单的例子:程序1:#includeusingnamespacestd;intmain(){ intm,n; cin>>m; cin>>n; return0;}测试情况:如果用户每次都输入两个合法的数,程序不会出问题!但是如果用户第一次输入时给一个非法的输入,比如说输入一个字符'a',你会发现程序不会再执行第二条输入语句。似乎有点奇怪!!程序2:#8、includeusingnamespacestd;intmain(){ charstr[8]; cin.getline(str,5); cout<9、常!测试二:abcdefgh(回车)abcd(输出) (输出-换行)当用户第一次输入的字符数字符数大于4时,第一个字符串接受输入的前四个字符,而第二次的输入操作没有执行,第二个字符串输出为空。似乎也很奇怪!!!其实在很多时候都会遇到诸如此类的问题,如果不熟悉程序输入的原理和cin等一些函数的原理就不知道怎么解决!我在这里做一个简单的介绍,也许介绍得不是很准确和全面,或者存在一些误解,请大家包涵!输入操作的原理与前一节中提到的scanf函数一样,程序的输入都建有一个缓冲区,即输入缓冲区。一次输入过程是这样的,10、当一次键盘输入结束时会将输入的数据存入输入缓冲区,而cin函数直接从输入缓冲区中取数据。正因为cin函数是直接从缓冲区取数据的,所以有时候当缓冲区中有残留数据时,cin函数会直接取得这些残留数据而不会请求键盘输入,这就是例子中为什么会出现输入语句失效的原因!cin的一些输入函数和操作符cinisaexternistreamobject。提供了很多可用的成员函数和重载的操作符,如:cin
2、,程序会正确的执行,并且提示用户重新输入。但是如果用户错误的输入了一个字符char,那么,后果就是一直执行while循环!错误分析:当cin尝试将输入的字符读为int型数据失败后,会产生一个错误状态--cin.fail().而要用cin读取输入流中的数据,输入流必须处于无错误状态。因此,由于错误状态的存在,会一直执行while循环。错误修正:#includeusingnamespacestd;intmain(){inta;while(cout<<"inputainteger(1-10):",
3、cin>>a,!(a>=1&&a<=10)
4、
5、cin.fail()){ cout<<"tryagain!"<6、存,下次在读取数据的时候又会再次产生错误,也会陷入死循环。cin输入流错误2010-09-0621:38事先声明,这个帖子不是我写的,不过,这点知识我觉得比较重要,转来了呵呵大家可以配合这个帖子学习一下这方面这是我搜集的相关的输入流异常处理知识(感兴趣的友友可以看看哈):很多初学者都认为cin函数是一个很简单的函数,其实不然!cin函数有很多需要了解的知识(比如:cin的返回值是什么,cin提供了哪些成员函数且分别是什么作用,如cin.clear(),cin.ignore(),cin.fail(),cin.go7、od()等等),如果没有很好的掌握,在使用的时候很可能会出问题却不知其原因!而且很多人也确确实实遇到过不少问题,以下是几个简单的例子:程序1:#includeusingnamespacestd;intmain(){ intm,n; cin>>m; cin>>n; return0;}测试情况:如果用户每次都输入两个合法的数,程序不会出问题!但是如果用户第一次输入时给一个非法的输入,比如说输入一个字符'a',你会发现程序不会再执行第二条输入语句。似乎有点奇怪!!程序2:#8、includeusingnamespacestd;intmain(){ charstr[8]; cin.getline(str,5); cout<9、常!测试二:abcdefgh(回车)abcd(输出) (输出-换行)当用户第一次输入的字符数字符数大于4时,第一个字符串接受输入的前四个字符,而第二次的输入操作没有执行,第二个字符串输出为空。似乎也很奇怪!!!其实在很多时候都会遇到诸如此类的问题,如果不熟悉程序输入的原理和cin等一些函数的原理就不知道怎么解决!我在这里做一个简单的介绍,也许介绍得不是很准确和全面,或者存在一些误解,请大家包涵!输入操作的原理与前一节中提到的scanf函数一样,程序的输入都建有一个缓冲区,即输入缓冲区。一次输入过程是这样的,10、当一次键盘输入结束时会将输入的数据存入输入缓冲区,而cin函数直接从输入缓冲区中取数据。正因为cin函数是直接从缓冲区取数据的,所以有时候当缓冲区中有残留数据时,cin函数会直接取得这些残留数据而不会请求键盘输入,这就是例子中为什么会出现输入语句失效的原因!cin的一些输入函数和操作符cinisaexternistreamobject。提供了很多可用的成员函数和重载的操作符,如:cin
6、存,下次在读取数据的时候又会再次产生错误,也会陷入死循环。cin输入流错误2010-09-0621:38事先声明,这个帖子不是我写的,不过,这点知识我觉得比较重要,转来了呵呵大家可以配合这个帖子学习一下这方面这是我搜集的相关的输入流异常处理知识(感兴趣的友友可以看看哈):很多初学者都认为cin函数是一个很简单的函数,其实不然!cin函数有很多需要了解的知识(比如:cin的返回值是什么,cin提供了哪些成员函数且分别是什么作用,如cin.clear(),cin.ignore(),cin.fail(),cin.go
7、od()等等),如果没有很好的掌握,在使用的时候很可能会出问题却不知其原因!而且很多人也确确实实遇到过不少问题,以下是几个简单的例子:程序1:#includeusingnamespacestd;intmain(){ intm,n; cin>>m; cin>>n; return0;}测试情况:如果用户每次都输入两个合法的数,程序不会出问题!但是如果用户第一次输入时给一个非法的输入,比如说输入一个字符'a',你会发现程序不会再执行第二条输入语句。似乎有点奇怪!!程序2:#
8、includeusingnamespacestd;intmain(){ charstr[8]; cin.getline(str,5); cout<9、常!测试二:abcdefgh(回车)abcd(输出) (输出-换行)当用户第一次输入的字符数字符数大于4时,第一个字符串接受输入的前四个字符,而第二次的输入操作没有执行,第二个字符串输出为空。似乎也很奇怪!!!其实在很多时候都会遇到诸如此类的问题,如果不熟悉程序输入的原理和cin等一些函数的原理就不知道怎么解决!我在这里做一个简单的介绍,也许介绍得不是很准确和全面,或者存在一些误解,请大家包涵!输入操作的原理与前一节中提到的scanf函数一样,程序的输入都建有一个缓冲区,即输入缓冲区。一次输入过程是这样的,10、当一次键盘输入结束时会将输入的数据存入输入缓冲区,而cin函数直接从输入缓冲区中取数据。正因为cin函数是直接从缓冲区取数据的,所以有时候当缓冲区中有残留数据时,cin函数会直接取得这些残留数据而不会请求键盘输入,这就是例子中为什么会出现输入语句失效的原因!cin的一些输入函数和操作符cinisaexternistreamobject。提供了很多可用的成员函数和重载的操作符,如:cin
9、常!测试二:abcdefgh(回车)abcd(输出) (输出-换行)当用户第一次输入的字符数字符数大于4时,第一个字符串接受输入的前四个字符,而第二次的输入操作没有执行,第二个字符串输出为空。似乎也很奇怪!!!其实在很多时候都会遇到诸如此类的问题,如果不熟悉程序输入的原理和cin等一些函数的原理就不知道怎么解决!我在这里做一个简单的介绍,也许介绍得不是很准确和全面,或者存在一些误解,请大家包涵!输入操作的原理与前一节中提到的scanf函数一样,程序的输入都建有一个缓冲区,即输入缓冲区。一次输入过程是这样的,
10、当一次键盘输入结束时会将输入的数据存入输入缓冲区,而cin函数直接从输入缓冲区中取数据。正因为cin函数是直接从缓冲区取数据的,所以有时候当缓冲区中有残留数据时,cin函数会直接取得这些残留数据而不会请求键盘输入,这就是例子中为什么会出现输入语句失效的原因!cin的一些输入函数和操作符cinisaexternistreamobject。提供了很多可用的成员函数和重载的操作符,如:cin
此文档下载收益归作者所有