AC程序,检查输入的日期是否有效

我被要求纠正一个程序,该程序检查用户输入的日期是否合法在C中。我尝试写它但我猜逻辑是不正确的。

//Legitimate date #include  void main() { int d,m,y,leap; int legit = 0; printf("Enter the date\n"); scanf("%i.%i.%i",&d,&m,&y); if(y % 400 == 0 || (y % 100 != 0 && y % 4 == 0)) {leap=1;} if (m<13) { if (m == 1 || (3 || ( 5 || ( 7 || ( 8 || ( 10 || ( 12 ))))))) {if (d <=31) {legit=1;}} else if (m == 4 || ( 6 || ( 9 || ( 11 ) ) ) ) {if (d <= 30) {legit = 1;}} else { if (leap == 1) {if (d <= 29) {legit = 1;}} if (leap == 0) {{if (d <= 28) legit = 1;}} } } if (legit==1) printf("It is a legitimate date!\n"); else printf("It's not a legitimate date!"); } 

如果月份有31天,我会得到正确的输出,但在剩下的几个月中,如果当天小于32,则输出是合法的。我们的帮助表示赞赏!

你不能像这样链接条件:

 if (m == 1 || (3 || ( 5 || ( 7 || ( 8 || ( 10 || ( 12 ))))))) 

相反,您必须特别测试每个场景:

 if (m == 1 || m == 3 || m == 5 || ...) 

您的版本只需将第一个测试( m == 1 )的结果与值3进行或运算,其中C值为非零,因此总是为布尔值true。

我重写你的程序简单易行,我认为这可能会有所帮助

 //Legitimate date #include  void main() { int d,m,y; int daysinmonth[12]={31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} int legit = 0; printf("Enter the date\n"); scanf("%i.%i.%i",&d,&m,&y); // leap year checking, if ok add 29 days to february if(y % 400 == 0 || (y % 100 != 0 && y % 4 == 0)) daysinmonth[1]=29; // days in month checking if (m<13) { if( d <= daysinmonth[m-1] ) legit=1; } if (legit==1) printf("It is a legitimate date!\n"); else printf("It's not a legitimate date!"); } 

这个测试肯定是错误的:

 if (m == 1 || (3 || ( 5 || ( 7 || ( 8 || ( 10 || ( 12 ))))))) 

这一定是

 if ((m == 1) || (m == 3) || (m == 5) || ... ) 

执行逻辑或非零表达式将始终评估为true。 因此,您的整个测试将永远是真实的。

您可以更简单地检查日期合法性:

 #define _XOPEN_SOURCE 600 #include  #include  #include  #include  time_t get_date(char *line){ #define WRONG() do{printf("Wrong date!\n"); return -1;}while(0) time_t date; struct tm time_, time_now, *gmt; time_.tm_sec = 0; time_.tm_hour = 0; time_.tm_min = 0; if(strchr(line, '.') && sscanf(line, "%d.%d.%d", &time_.tm_mday, &time_.tm_mon, &time_.tm_year) == 3){ time_.tm_mon--; time_.tm_year += (time_.tm_year < 100) ? 100 : -1900; }else WRONG(); memcpy(&time_now, &time_, sizeof(struct tm)); date = mktime(&time_now); gmt = localtime(&date); if(time_.tm_mday != gmt->tm_mday) WRONG(); if(time_.tm_mon != gmt->tm_mon) WRONG(); if(time_.tm_year != gmt->tm_year) WRONG(); date = mktime(&time_); return date; #undef WRONG } int main(int argc, char** argv){ struct tm *tmp; if(argc != 2) return 1; time_t GD = get_date(argv[1]); if(GD == -1) return -1; printf("Int date = %d\n", GD); printf("your date: %s\n", ctime(&GD)); return 0; } 
 //reading date and checking if valid or not //firstly we will check the yeear then the month and then the date // // // // #include int main() { int d,m,y; printf("ENTER THE DATE IN DD/MM/YYYY FORMAT:"); scanf("%d%d%d",&d,&m,&y); //check year if(y>0 && y<9999) { // check month if(m>=1 && m<=12) { if((d>=1 && d<=31) && (m==1 || m==3 || m==5 || m==7 || m==8 || m==10 || m==12)) printf("the date is valid in a month with 31 days:"); else if ((d>=1 && d<=30) && (m==4 || m==6 || m==9 || m==11 )) printf("the date is valid in a feb with 30 days:"); else if ((d>=1 && d<=29) && (m==2) && ((y%400==0) || (y%4==0) && (y%100!=0))) printf("the date is valid in feb of a leap year:"); else if ((d>=1 && d<=28) && (m==2) && (y%4==0) && (y%100==0)) printf("the date is valid in feb of a leap year:"); else if ((d>=1 && d<=28) && (m==2) && (y%4!=0) ) printf("the date is valid in feb of a non leap year:"); else printf("the date is invalid:"); } else { printf("the month is not valid:"); } } else { printf("the date is not valid:"); } return 0; }