定义一个日期结构体保存日期,具体信息为:年、月、日
判断出生日期的格式是否合法时,需要判断长度是否为10,第5位和第8位是否为’-’,字符,将1-4位表示的年份,6-7位表示的月份,9-10位表示的日期分别转换成整数。判断是否满足构成日期的条件闰年月份只能是1-12之间的数,如果是闰年,二月可以是29天否则不能大于28,1,3,5,7,8,10,12月可以是31天,其余只能小于等于30(建议写成函数)。
如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct StDate
{
int year,mon,day;
StDate(){}
StDate(int y,int m,int d)
{
year = y;
mon = m;
day = d;
}
};
int isValid(char* str,struct StDate *st)
{
int falg = 1,i;
char tmp[8] = {0};
int year,mon,day;
//判断长度
if(strlen(str) != 10)
return 0;
//判断第5/8位是否是-
if(str[4] != '-' || str[7] != '-')
return 0;
//判断1-4,6-7/9-10是否是数字
for ( i = 0;i<4;i++)
{
if(str[i] < '0' || str[i] > '9')
return 0;
}
for (i = 5;i<7;i++)
{
if(str[i] < '0' || str[i] > '9')
return 0;
}
for (i = 8;i<10;i++)
{
if(str[i] < '0' || str[i] > '9')
return 0;
}
strcpy_s(tmp,4,str);
year = atoi(tmp);
strcpy_s(tmp,2,str+5);
tmp[3] = 0;
mon = atoi(tmp);
strcpy_s(tmp,2,str+8);
tmp[3] = 0;
day = atoi(tmp);
if(year < 0) return 0;
if(mon < 1 || mon > 12) return 0;
if(mon == 2)
{
//判断是否是闰年
if (year%4 == 0 && year%100 != 0)
{
if(day < 1 || day > 29)
return 0;
}else
{
if(day < 1 || day > 28)
return 0;
}
}else if (mon == 1 || mon == 3 || mon == 5 || mon== 7 || mon == 8 || mon==10 || mon==12)
{
if(day <1 || day >31)
return 0;
}else
{
if(day < 1 || day > 30)
return 0;
}
st->year = year;
st->mon = mon;
st->day = day;
return 1;
}
int main()
{
char buf[20]={0};
struct StDate dt;
scanf("%s",buf);
if (isValid(buf,&dt))
{
printf("合法,日期:%d-%d-%d\n",dt.year,dt.mon,dt.day);
}else
printf("不合法\n");
return 0;
}