2011-05-23 57 views
0

我试图从1901年1月1日到2299年12月31日输入日期,如果日期超出范围,给出错误消息,这是我的代码,一些它如何得到此验证没有正确地验证,我做错了什么在C中验证帮助

int main (void) 
{ 
    // insert code here... 
    int day,month,year; 
    printf("Enter Year, Month and Day as YYYY,MM,DD\n"); 

    scanf("4%d 2%d 2%d", &year, &month, &day); 

    if (year>1900 && year <2300) { 
     if (month>=1 && month <=12) 
      if (day >=1 && day <=31) 
       printf("correct/n"); 
      else 
       printf("invalid/n"); 
    } 
    return 0; 
} 
+1

如果我输入:'1959 02 31',会发生什么?最有可能有更好的解决方案。 – 2011-05-23 20:55:30

回答

2

问题是您使用嵌套的if语句,但是您没有足够的else语句。如果你简单地合并它应该工作的声明。

if (year > 1900 && year < 2300 && 
    month > 0 && month < 13 && 
    day > 0 && day < 32) 
{ 
    printf("correct\n"); 
} 
else 
{ 
    printf("invalid\n"); 
} 
2

如果我这样做,我想我会用像一个小功能入手:

int in_range(int val, int lower, int upper) { 
    return val >= lower && val <= upper; 
} 

然后,我喜欢写东西:

if (in_range(year, 1901, 2299) && in_range(month, 1, 12) && in_range(day, 1, 31)) 
    printf("Corrent\n"); 
else 
    printf("invalid\n"; 
0

对于许多条件你都不会说什么。修复:

if (year>1900 && year <2300) { 
    if (month>=1 && month <=12) { 
     if (day >=1 && day <=31) 
     printf("correct/n"); 
     else 
     printf("invalid/n"); 
    } else { 
     printf("invalid/n"); 
} else { 
    printf("invalid/n"); 
} 

当然,您可以折叠该代码以避免冗余。

if ( year > 1900 && year < 2300 
    && month >= 1 && month <= 12 
    && day >= 1 && day <= 31 
) { 
    printf("correct/n"); 
} else { 
    printf("invalid/n"); 
} 

我会将该逻辑移入一个函数。

int is_valid_date(int year, int month, int day) { 
    return (year > 1900 && year < 2300 
     && month >= 1 && month <= 12 
     && day >= 1 && day <= 31 
    ); 
} 

if (is_valid_date(year, month, day)){ 
    printf("correct/n"); 
} else { 
    printf("invalid/n"); 
} 
+0

仍然没有解决2月31日的问题。 – 2011-05-23 21:09:23