nemozhang今天写了个程序,结果发现一个问题!请大虾们指点一二!源程序代码如下:#include<iostream>using namespace std;void main(){ int year; do { cout<<endl<<"请输入年份(格式为XXXX):"; cin>>year; if(year<0||year>9999) { cout<<"输入错误!"<<endl; cout<<endl<<"请输入年份(格式为XXXX):"; cin>>year; } }while(year<0||year>9999); }运行结果是:输入数字一切正常;如果输入的是字母的话就出现死循环了 反复的 请输入年份(格式为XXXX):输入错误! 跪求解释
aipb2007当然死循环,year是int型,输入字符流将被设置错误,残留的输入会导致死循环。可以加如判断,使只能输入数字。cin >> year;while (cin.bad()){ cout << "bad input.\n"; cin.clear(); cin.ignore(); cin >> year;}
nemozhang 程序我进行了调试,发现如果输入的是字符,year这个变量并没有被赋值,现在修改了一下,没有问题了! 早上看过斑竹的回帖后,又去查了一下CIN的详细,才明白了不少! 小弟感激万分!呵呵! 现在又出现个问题,我编的程序,需要多次调用这个循环,在二次调用这个循环的时候,再次出现了死循环这是为什么? 我尝试了一下,改了一下代码,将判断语句中的cin.bad()改成cin.fail(),就又正常了,能帮我解释一下吗?
aipb2007晕,我的错,又笔误,我想写的就是cin.fail()cin.bad()是输入流被不可恢复的破坏。cin.fail()是可恢复的。你的情况是后者,道理一样,你如果用cin >> 这样的形式做循环条件,那退出循环的时候,流就被设置了failbit或者eofbit,所以要清除流错误状态,同时清除残留在输入缓冲区里的输入, ignore()就有这个功能,当然也可以用sync()……还有几个函数,自己查下,都可以。我太粗心了,呵呵~不好意思。
nemozhang 呵呵,没关系了,问题不都解决了吗!没到论坛提问,俺都不知道还有这gate道的,看来还需要多多学习才是啊!
引用第16楼yinx于2007-11-12 22:46发表的 :好了,我投降了…… 上外网找答案: