cin读取失败后进入死循环.docx
- 文档编号:6132119
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:10
- 大小:26.44KB
cin读取失败后进入死循环.docx
《cin读取失败后进入死循环.docx》由会员分享,可在线阅读,更多相关《cin读取失败后进入死循环.docx(10页珍藏版)》请在冰豆网上搜索。
cin读取失败后进入死循环
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!
"< return 0; } 本意是让用户选择一个1-10的数,如果不是1-10的数则重新输入。 分析: 如果用户输入了一个不在1-10的int,那么,程序会正确的执行,并且提示用户重新输入。 但是如果用户错误的输入了一个字符char,那么,后果就是一直执行while循环! 错误分析: 当cin尝试将输入的字符读为int型数据失败后,会产生一个错误状态--cin.fail().而要用cin读取输入流中的数据,输入流必须处于无错误状态。 因此,由于错误状态的存在,会一直执行while循环。 错误修正: #include usingnamespacestd; intmain() { inta; while(cout<<"inputainteger(1-10): ",cin>>a,! (a>=1&&a<=10)||cin.fail()) { cout<<"tryagain! "< cin.clear();//清除std: : cin的错误状态 cin.sync();//清空输入缓冲区 } return0; } 加上判断输入是否成功的cin.fail()以及修正错误输入的cin.clear()和cin.sync(); 其中std: : cin.sync();这一句必不可少,因为所有从标准输入设备输入的数据都是先保存在缓冲区中,然后istream对象再从缓冲区中进行提取。 如果不清空缓存,下次在读取数据的时候又会再次产生错误,也会陷入死循环。 cin输入流错误 2010-09-0621: 38 事先声明,这个帖子不是我写的,不过,这点知识我觉得比较重要,转来了呵呵 大家可以配合这个帖子学习一下这方面 这是我搜集的相关的输入流异常处理知识(感兴趣的友友可以看看哈) : 很多初学者都认为cin函数是一个很简单的函数,其实不然! cin函数有很多需要了解的知识(比如: cin的返回值是什么,cin提供了哪些成员函数且分别是什么作用,如cin.clear(),cin.ignore(),cin.fail(),cin.good()等等),如果没有很好的掌握,在使用的时候很可能会出问题却不知其原因! 而且很多人也确确实实遇到过不少问题,以下是几个简单的例子: 程序1: #include usingnamespacestd; intmain() { intm,n; cin>>m; cin>>n; return0; } 测试情况: 如果用户每次都输入两个合法的数,程序不会出问题! 但是如果用户第一次输入时给一个非法的输入,比如说输入一个字符'a',你会发现程序不会再执行第二条输入语句。 似乎有点奇怪! ! 程序2: #include usingnamespacestd; intmain() { charstr[8]; cin.getline(str,5); cout< cin.getline(str,5); cout< return0; } 程序的功能很简单,就是输入一个字符串再输出,再次输入一个字符串输出。 程序执行情况: 测试一: abcd(回车)abcd(输出)efgh(回车)efgh(输出)当用户第一次输入的字符串字符数小于4时,程序执行正常! 测试二: abcdefgh(回车)abcd(输出) (输出-换行)当用户第一次输入的字符数字符数大于4时,第一个字符串接受输入的前四个字符,而第二次的输入操作没有执行,第二个字符串输出为空。 似乎也很奇怪! ! ! 其实在很多时候都会遇到诸如此类的问题,如果不熟悉程序输入的原理和cin等一些函数的原理就不知道怎么解决! 我在这里做一个简单的介绍,也许介绍得不是很准确和全面,或者存在一些误解,请大家包涵! 输入操作的原理与前一节中提到的scanf函数一样,程序的输入都建有一个缓冲区,即输入缓冲区。 一次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入缓冲区,而cin函数直接从输入缓冲区中取数据。 正因为cin函数是直接从缓冲区取数据的,所以有时候当缓冲区中有残留数据时,cin函数会直接取得这些残留数据而不会请求键盘输入,这就是例子中为什么会出现输入语句失效的原因! cin的一些输入函数和操作符cinisaexternistreamobject。 提供了很多可用的成员函数和重载的操作符,如: cin<<,cin.get(),cin.getline()等。 下面我们来了解一下这几个函数: 一.cin<<该操作符是根据后面变量的类型读取数据。 输入结束条件: 遇到Enter、Space、Tab键。 (这个很重要! )对结束符的处理: 丢弃缓冲区中使得输入结束的结束符(Enter、Space、Tab) 读字符的情况: 程序3: #include usingnamespacestd; intmain() { charc1,c2; cin>>c1; cin>>c2; cout< return0; } 测试一输入: a[Enter]b[Enter]输出: ab测试二输入: ab[Enter]输出: ab 读字符串的情况: 程序4: #include usingnamespacestd;i ntmain() { charstr1[10],str2[10]; cin>>str1; cin>>str2; cout< cout< return0; } 测试一输入: abcd[Enter]efgh[Enter]输出: abcdefgh【分析】输入遇到回车符结束,很正常。 测试二输入: abcdefgh输出: abcdefgh【分析】第一次读取字符串时遇到空格则停止了,将abcd读入str1,并舍弃了空格,将后面的字符串给了第二个字符串。 这证明了cin读入数据遇到空格结束;并且丢弃空格符;缓冲区有残留数据室,读入操作直接从缓冲区中取数据。 二.cin.get()该函数有三种格式: 无参,一参数,二参数即cin.get(),cin.get(charch),cin.get(array_name,Arsize)读取字符的情况: 输入结束条件: Enter键对结束符处理: 不丢弃缓冲区中的Entercin.get()与cin.get(charch)用于读取字符,他们的使用是相似的,即: ch=cin.get()与cin.get(ch)是等价的。 程序5: #include usingnamespacestd; intmain() { charc1,c2; cin.get(c1); cin.get(c2); cout< cout<<(int)c1<<""<<(int)c2< return0; } 测试一输入: a[Enter]输出: a9710【分析】会发现只执行了一次从键盘输入,显然第一个字符变量取的'a',第二个变量取的是Enter(ASCII值为10),这是因为该函数不丢弃上次输入结束时的Enter字符,所以第一次输入结束时缓冲区中残留的是上次输入结束时的Enter字符! 测试二输入: ab[Enter]输出: a9732【分析】显然第一个字符变量取的'a',第二个变量取的是Space(ASCII值为32)。 原因同上,没有丢弃Space字符。 读取字符串的情况: cin.get(array_name,Arsize)是用来读取字符串的,可以接受空格字符,遇到Enter结束输入,按照长度(Arsize)读取字符,会丢弃最后的Enter字符。 程序6: #include usingnamespacestd; intmain() { chara[20]; cin.get(a,10); cout< return0; } 测试一输入: abcdef[Enter]输出: abcdef【分析】说明该函数输入字符串时可以接受空格。 测试二输入: 1234567890[Enter]输出: 123456789【分析】输入超长,则按需要的长度取数据。 程序7: #include usingnamespacestd; intmain() { charch,a[20]; cin.get(a,5); cin>>ch;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- cin 读取 失败 后进 循环