2011-05-23 69 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