cin读取失败后进入死循环.doc

  1. 1、本文档共10页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
cin读取失败后进入死循环

cin读取失败后进入死循环?-------剖析输入流的条件 考虑如下代码: ? #include?iostream using?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 iostream using 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 iostream using namespace std; int main() { ?? int m, n; ??? ?? ??? cinm; ?? ?? cinn; ?? return 0; } 测试情况:如果用户每次都输入两个合法的数,程序不会出问题!但是如果用户第一次输入时给一个非法的输入,比如说输入一个字符a,你会发现程序不会再执行第二条输入语句。似乎有点奇怪!! 程序2: #include iostream using 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函数会直接取得这些残留数据而不会请求键盘输入,这就

文档评论(0)

shenlan118 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档