2017-04-01 21 views
1

我很新的C++和試圖找出如何解決這個問題,所以任何幫助,絕對讚賞。我需要以「yyyy/mm/dd,hh:mm」的形式從用戶處獲取日期輸入,然後驗證其功能並驗證其零件。 到目前爲止,我已經嘗試了一切,我已經學會了,最小錯誤的最佳解決方案是以下代碼。還有一個我不能修改的預定義測試客戶端代碼。客戶端代碼中有很多步驟,每個驗證都經過測試。例如:以用戶的「yyyy/mm/dd,hh:mm」格式輸入日期並在C++中驗證日期?

一個輸入是「2000/1/50」,我得到DAY_ERROR,這是真的。 另一個輸入是「2000/1/1,25:10」,我得到HOUR_ERROR也是如此。一切都很好,直到最後一部分(檢查分鐘)。當輸入是「2000/1/1,23:60」時,我再次獲得HOUR_ERROR而不是MIN_ERROR。 我不確定是否因爲「,」之後的空格。但是,如果是這種情況,我不知道如何解決它。

std::istream& Date::read(std::istream& is = std::cin) { 
    int year; 
    int mon; 
    int day; 
    int hour; 
    int min; 
    bool valid; 
    ((((is >> year).ignore(100, '/') >> mon).ignore(100, '/') >> day).ignore(100, ',') >> hour).ignore(100, ':') >> min; 

     bool val_year = sizeof(year) == 4 && year >= MIN_YEAR && year <= MAX_YEAR; 
     bool val_mon = mon >= 1 && mon <= 12; 
     bool val_day = day >= 1 && day <= mday(); 
     bool val_hour = sizeof(hour) == 2 && hour >= 0 && hour <= 23; 
     bool val_min = sizeof(min) == 2 && min >= 0 && min <= 59; 
     valid = val_year && val_mon && val_day && val_hour && val_min; 
     if (valid) { 
      errCode(NO_ERROR); 
      Date D2(year, mon, day, hour, min); 
     } 
     else { 
      if (!val_year) 
       errCode(YEAR_ERROR); 
      else if (!val_mon) 
       errCode(MON_ERROR); 
      else if (!val_day) 
       errCode(DAY_ERROR); 
      else if (!val_hour) 
       errCode(HOUR_ERROR); 
      else if (!val_min) 
       errCode(MIN_ERROR); 
      else 
       errCode(NO_ERROR); 
      } 
     } 
     return is; 
    } 

回答

0

這裏有一個建議:

/* 
* EXAMPLE INPUT: 2/22/17, 20:15 
* EXAMPLE OUTPUT: input: 02/22/17, 20:15 
*/ 
#include <stdio.h> 

int main() 
{ 
    int year, month, day, hour, min; 
    char buff[80]; 

    fgets (buff, sizeof(buff), stdin); 
    int n = sscanf(buff, "%d/%d/%d, %d:%d", &year, &month, &day, &hour, &min); 
    if (n != 5) { 
    printf ("Error parsing input: expected 5 values, got %d...\n", n); 
    return 1; 
    } 
    printf ("input: %02d/%02d/%d, %02d:%02d\n", year, month, day, hour, min); 

    return 0; 
} 

至於驗證日期:你的代碼看起來不錯。

或者您可能需要考慮將日期/時間值讀入struct tm_date(而不是年,月,日等),然後使用strftime進行驗證。

下面是一個例子:

taking date as dd/mm/yy in c language