- 1、本文档共10页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
cin读取失败后进入死循环
cin读取失败后进入死循环?-------剖析输入流的条件
考虑如下代码:
?
#include?iostreamusing?namespace?std;int?main(){??int?a;??while(coutinput?a?integer?(1-?10)?:,cina,!?(a=1??a=10))???couttry?again!endl;return?0;}
本意是让用户选择一个1-10的数,如果不是1-10的数则重新输入。
分析:
如果用户输入了一个不在1-10的 int,那么,程序会正确的执行,并且提示用户重新输入。
但是如果用户错误的输入了一个字符char,那么,后果就是一直执行while循环!
错误分析:
当cin尝试将输入的字符读为int型数据失败后,会产生一个错误状态--cin.fail().而要用cin读取输入流中的数据,输入流必须处于无错误状态。因此,由于错误状态的存在,会一直执行while循环。
错误修正:
#include iostreamusing namespace std;
int main(){int a;while(coutinput a integer (1-10) :,cina,! (a=1 a=10) || cin.fail()){?? couttry again!endl;?? cin.clear(); //清除std::cin的错误状态?? cin.sync(); //清空输入缓冲区}return 0;}
加上判断输入是否成功的cin.fail()以及修正错误输入的cin.clear()和cin.sync();
其中std::cin.sync();这一句必不可少,因为所有从标准输入设备输入的数据都是先保存在缓冲区中,然后istream对象再从缓冲区中进行提取。如果不清空缓存,下次在读取数据的时候又会再次产生错误,也会陷入死循环。
cin输入流错误
2010-09-06 21:38
事先声明,这个帖子不是我写的,不过,这点知识我觉得比较重要,转来了 呵呵大家可以配合这个帖子学习一下这方面这是我搜集的相关的输入流异常处理知识(感兴趣的友友可以看看哈) :很多初学者都认为cin函数是一个很简单的函数,其实不然!cin函数有很多需要了解的知识(比如:cin的返回值是什么,cin提供了哪些成员函数且分别是什么作用,如cin.clear(), cin.ignore(), cin.fail(), cin.good()等等),如果没有很好的掌握,在使用的时候很可能会出问题却不知其原因!而且很多人也确确实实遇到过不少问题,以下是几个简单的例子:程序1:#include iostreamusing namespace std;int main(){ ?? int m, n; ????? ??? cinm;?? ?? cinn;?? return 0;}测试情况:如果用户每次都输入两个合法的数,程序不会出问题!但是如果用户第一次输入时给一个非法的输入,比如说输入一个字符a,你会发现程序不会再执行第二条输入语句。似乎有点奇怪!!程序2:#include iostreamusing namespace std;int main(){????? char str[8]; ?? ?? cin.getline(str, 5); ???coutstrendl; ???cin.getline(str, 5); ???coutstrendl; ??? return 0;}程序的功能很简单,就是输入一个字符串再输出,再次输入一个字符串输出。程序执行情况:测试一:abcd (回车)abcd (输出)efgh (回车)efgh (输出)当用户第一次输入的字符串字符数小于4时,程序执行正常!测试二:abcdefgh (回车)abcd (输出) ??? (输出-换行)当用户第一次输入的字符数字符数大于4时,第一个字符串接受输入的前四个字符,而第二次的输入操作没有执行,第二个字符串输出为空。似乎也很奇怪!!!其实在很多时候都会遇到诸如此类的问题,如果不熟悉程序输入的原理和cin等一些函数的原理就不知道怎么解决!我在这里做一个简单的介绍,也许介绍得不是很准确和全面,或者存在一些误解,请大家包涵!输入操作的原理与前一节中提到的scanf函数一样,程序的输入都建有一个缓冲区,即输入缓冲区。一次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入缓冲区,而cin函数直接从输入缓冲区中取数据。正因为cin函数是直接从缓冲区取数据的,所以有时候当缓冲区中有残留数据时,cin函数会直接取得这些残留数据而不会请求键盘输入,这就
您可能关注的文档
最近下载
- LittleSwan小天鹅TB36V81H 波轮全自动洗衣机 巴赫银 门盖巴赫银 波轮式 220V,1Ph 50Hz.pdf
- 广东梅州抽水蓄能电站二期环境影响报告书(送审稿).doc
- 第一讲:形势与政策课件.ppt VIP
- 大型轧辊激光毛化及表面强化成套系统项目建议书.pdf
- 林和靖意象在日本文化中的流播和变异___以汉诗文为中心.pdf
- 阳光棚光伏支架结构计算书.pdf
- Project 2 Our friends(教案)-2021-2022学年英语五年级上册 .docx
- 气测录井资料解释与应用详细课件.ppt VIP
- 气测录井资料解释与应用详细课件.pptx VIP
- 旧建筑再利用的计手法及相关问题探讨——以博览类建筑为例.pdf
文档评论(0)