当前位置: 代码迷 >> C语言 >> 输入数据的问题
  详细解决方案

输入数据的问题

热度:315   发布时间:2007-06-09 03:20:50.0
输入数据的问题

下面是我编写的求出今天是今年的第几天的程序,运行一切正常。可是为什么我输入一个字母的时候就会造成死循环呢?想不通~~~~哪位朋友讲解一下,谢谢
#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  数据  

----------------解决方案--------------------------------------------------------

#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用--不好


----------------解决方案--------------------------------------------------------
不明白哦~    ~
----------------解决方案--------------------------------------------------------
我认为是这样的:输入字母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;}



----------------解决方案--------------------------------------------------------

谢谢 这样果然可以了。


----------------解决方案--------------------------------------------------------
以下是引用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;}


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


----------------解决方案--------------------------------------------------------
  相关解决方案