“这是不是判断输入的是否为数值,如果是就继续循环输入,一直到输入非数值!”:是的。
“scanf
是怎么判断输入是否为数值的?”:通过判断输入值是否和占位符类型匹配判断,如果匹配,返回匹配个数,不匹配,则函数结束,后面的占位符也不再判断。当然你这里只有一个占位符“%lf”,就只有0,1两种返回方案。
“是scanf的返回值吗?”:返回值是输入值和占位符匹配决定的。
“那如果换成%s%c时输入字符他是不是也和输入数值时一样会判断是否为字符,如果输入的不是字符也和上面一样就停止了呢?”:原理上是这样,但是占位符为“%s”时,你可以输入任意字符,因为你键盘上输入的任意字符都可以被匹配为“%s”,一串数字也可以是字符串。
#include
"stdio.h"
struct
date{
int
y;
int
m;
int
d;
}yd;
void
main()
{
int
n=0;
int
ac(struct
date
*f,int
n);
struct
date
*p;
p=&yd;
printf("请输入日期(年,月,日):");
scanf("%d%d%d",&p->y,&p->m,&p->d);
while(p->m>12||p->m<1||p->d>31||p->d<1)
{printf("输入错误,请重输:");scanf("%d%d%d",&p->y,&p->m,&p->d);}
n=ac(p,n);
printf("该日在%d年的第%d天",p->y,n);
}
int
ac(struct
date
*f,int
n)
{
int
i;
for(i=1;i
m;i++)
{
if(i==2)
{
if(((f->y%4==0)&&(f->y%100!=0))||(f->y%400==0))
n+=29;
else
n+=28;
}
else
{
if(i<7)
{
if((i%2)==0)
n+=30;
else
n+=31;
}
if(i>=7)
{
if((i%2)==0)
n+=31;
else
n+=30;
}
}
}
n+=f->d;
return
n;
}
呵呵,领分咯