| 编程中国 | 业界新闻 | 技术文章 | 视频教程 | 下载频道 | 程序源码 | 个人空间 | 编程论坛
全能ASP/PHP/ASP.NET主机,支持月付专业 MSSQL 数据库空间,支持月付专业 MySQL 数据库空间,支持月付赛孚耐:软件保护加密专家
身份认证令牌USB KEY   
共有 240 人关注过本帖
标题:输入数据的问题
收藏  订阅  推荐  打印 
heecn
Rank: 1
等级:新手上路
帖子:18
积分:280
注册:2006-6-30
输入数据的问题

下面是我编写的求出今天是今年的第几天的程序,运行一切正常。可是为什么我输入一个字母的时候就会造成死循环呢?想不通~~~~哪位朋友讲解一下,谢谢
#include<stdio.h>
struct date
{
int year;
int month;
int day;
}today;
int main()
{
int i,month_days,total_days=0;
loop:printf("请输入今天的日期:");
scanf("%d%d%d",&today.year,&today.month,&today.day);
if(today.year<0||today.month>12||today.month<=0||today.day<=0||today.day>31) goto loop;
printf("今天是 %d-%d-%d\n",today.year,today.month,today.day);
for(i=1;i<today.month;i++)
{
if(i==1||i==3||i==5||i==7||i==8||i==10||i==12) month_days=31;
else
if(i==4||i==6||i==9||i==11) month_days=30;
else
if(today.year%400==0||today.year%4==0&&today.year%100!=0) month_days=29;
else month_days=28;
total_days+=month_days;
}
total_days+=today.day;
printf("今天是%d的第%d天!\n",today.year,total_days);
getch();
}

[此贴子已经被作者于2007-6-9 3:25:11编辑过]

搜索更多相关主题的帖子: today  int  month  数据  
2007-6-9 03:20
我是菜鸟哦
Rank: 12Rank: 12Rank: 12
等级:版主
威望:17
帖子:760
积分:8660
注册:2007-5-4

#include<stdio.h>
struct date
{
int year;
int month;
int day;
}today;
int main()
{
int i,month_days,total_days=0;
loop:printf("请输入今天的日期:");
scanf("%d%d%d",&today.year,&today.month,&today.day);
if(today.year<0||today.month>12||today.month<=0||today.day<=0||today.day>31) { while(getchar()!=10;goto loop;}/*清除下缓冲流*/
printf("今天是 %d-%d-%d\n",today.year,today.month,today.day);
for(i=1;i<today.month;i++)
{
if(i==1||i==3||i==5||i==7||i==8||i==10||i==12) month_days=31;
else
if(i==4||i==6||i==9||i==11) month_days=30;
else
if(today.year%400==0||today.year%4==0&&today.year%100!=0) month_days=29;
else month_days=28;
total_days+=month_days;
}
total_days+=today.day;
printf("今天是%d的第%d天!\n",today.year,total_days);
getch();
}

loop用--不好


偶是菜鸟鸟偶惧WHO?!!!!
2007-6-9 13:05
heecn
Rank: 1
等级:新手上路
帖子:18
积分:280
注册:2006-6-30

不明白哦~    ~
2007-6-9 23:36
chyhome
Rank: 2
等级:注册会员
威望:1
帖子:102
积分:1120
注册:2007-5-13

我认为是这样的:输入字母a,程序判断“非法”(不是INT型),结束输入赋值,这时year、month、day应为初始值0,满足判断条件,通过GOTO语句返回,再次进行输入,由于先前输入的字符a未被SCANF语句接收(在键盘缓冲区内),因此再次判断a字符位“非法”,重复不断循环。
解决方法:
改:if(today.year<0||today.month>12||today.month<=0||today.day<=0||today.day>31) goto loop;
位:if(today.year<0||today.month>12||today.month<=0||today.day<=0||today.day>31) {getchar(); goto loop;}



2007-6-10 02:17
heecn
Rank: 1
等级:新手上路
帖子:18
积分:280
注册:2006-6-30

谢谢 这样果然可以了。

2007-6-11 00:52
heecn
Rank: 1
等级:新手上路
帖子:18
积分:280
注册:2006-6-30

以下是引用chyhome在2007-6-10 2:17:01的发言:
我认为是这样的:输入字母a,程序判断“非法”(不是INT型),结束输入赋值,这时year、month、day应为初始值0,满足判断条件,通过GOTO语句返回,再次进行输入,由于先前输入的字符a未被SCANF语句接收(在键盘缓冲区内),因此再次判断a字符位“非法”,重复不断循环。
解决方法:
改:if(today.year<0||today.month>12||today.month<=0||today.day<=0||today.day>31) goto loop;
位:if(today.year<0||today.month>12||today.month<=0||today.day<=0||today.day>31) {getchar(); goto loop;}


十分感谢你的分析,也理解了。忠心祝愿你每天有一个好心情

2007-6-11 00:55
关于我们 | 广告合作 | 编程中国 | 清除Cookies | Archiver | WAP | TOP

编程中国 版权所有,并保留所有权利。鲁ICP备08000592号
Powered by Discuz, Processed in 0.070739 second(s), 9 queries.
Copyright©2004-2008, BCCN.NET, All Rights Reserved