找回密码
 注册
搜索
热搜: 回贴
  • 前程无忧官网首页 有什么好的平台可以
  • 最新的销售平台 互联网营销的平台有哪
  • 制作网页的基本流程 网页制作和网页设
  • 【帝国CMS】输出带序号的列表(数字排
  • 网站建设公司 三一,中联,极东泵车的
  • 织梦 建站 织梦网站模版后台怎么更改
  • 云服务官网 哪些网站有免费的简历模板
  • 如何建网站要什么条件 建网站要用什么
  • 吉林市移动公司电话 吉林省退休人员网
  • 设计类毕业论文 网站设计与实现毕业论
查看: 1539|回复: 4

[求助]死循环!实在是菜的不行

[复制链接]
发表于 2009-11-2 01:28:34 | 显示全部楼层 |阅读模式 IP:江苏扬州
今天写了个程序,结果发现一个问题!请大虾们指点一二!
源程序代码如下:
#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):输入错误!
跪求解释
发表于 2009-11-2 01:28:37 | 显示全部楼层 IP:江苏扬州
当然死循环,year是int型,输入字符流将被设置错误,残留的输入会导致死循环。

可以加如判断,使只能输入数字。

cin >> year;
while (cin.bad()){
cout << "bad input.\n";
cin.clear();
cin.ignore();
cin >> year;
}
回复

使用道具 举报

发表于 2009-11-2 01:28:40 | 显示全部楼层 IP:江苏扬州
程序我进行了调试,发现如果输入的是字符,year这个变量并没有被赋值,现在修改了一下,没有问题了!
早上看过斑竹的回帖后,又去查了一下CIN的详细,才明白了不少!
小弟感激万分!呵呵!


现在又出现个问题,我编的程序,需要多次调用这个循环,在二次调用这个循环的时候,再次出现了死循环这是为什么?
我尝试了一下,改了一下代码,将判断语句中的cin.bad()改成cin.fail(),就又正常了,能帮我解释一下吗?
回复

使用道具 举报

发表于 2009-11-2 01:28:46 | 显示全部楼层 IP:江苏扬州
晕,我的错,又笔误,我想写的就是cin.fail()

cin.bad()是输入流被不可恢复的破坏。
cin.fail()是可恢复的。

你的情况是后者,道理一样,你如果用cin >> 这样的形式做循环条件,那退出循环的时候,流就被设置了failbit或者eofbit,所以要清除流错误状态,同时清除残留在输入缓冲区里的输入,ignore()就有这个功能,当然也可以用sync()……还有几个函数,自己查下,都可以。

我太粗心了,呵呵~不好意思。
回复

使用道具 举报

发表于 2009-11-2 01:28:50 | 显示全部楼层 IP:江苏扬州
呵呵,没关系了,问题不都解决了吗!没到论坛提问,俺都不知道还有这门道的,看来还需要多多学习才是啊!

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏ICP备08020429号 )

GMT+8, 2024-9-29 21:24 , Processed in 0.173903 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表