2017-10-07 9 views
0

ストリームを作成して、このような行(01 10 2017)の日付形式を検証しようとしています。C++で日付形式を検証する

 if(i%5==4){ //DATE 
      std::string date; 
      int day; 
      int month; 
      int year; 
      std::ostringstream oss(date); 
      oss >> day; 
      oss >> month; 
      oss >> year; 
      if (day >=0 && day <= 31){ 
       return true;} 
      if (month >=01 && month <= 12){ 
       return true;} 
      if (year >=1900){ 
       return true;} 
     } 

ただし、コードはコンパイルされません。検証を改善するために私は何ができますか?

ありがとうございました

+0

ストリーム挿入演算子 '<< 'を逆にするのは怖いです。 – iBug

+0

AFAIK 'std :: ostream'には' operator >>() 'がありません。 – iBug

+0

[std :: get_time](http://en.cppreference.com/w/cpp/io/manip/get_time)を調べる価値があります。 – Galik

答えて

2

希望します。

if(i%5==4){ //DATE 
     std::string date; 
     int day; 
     int month; 
     int year; 
     std::ostringstream oss(date); 
     oss << day; 
     oss << month; 
     oss << year; 
     const int lookup_table[12] = {31,29,31,30,31,30,31,31,30,31,30,31}; 
     if (!(month >= 1 && month <= 12)){ 
      return false;} 
     if (!(day >= 1 && day <= lookup_table[month-1])){ 
      return false;} 
     if (!(year >= 1900)){ 
      return false;} 
     return true; 
    } 
2

私は検証を改善するために何ができますか?

Howard Hinnant's free, open source, header-only date/time libraryなどの十分にテストされた日付/時刻ライブラリを使用してください。

 if (day >=0 && day <= 31){ 
      return true;} 

が途中を戻します

bool 
is_DMY(const std::string& date) 
{ 
    std::istringstream in{date}; 
    date::year_month_day ymd; 
    in >> date::parse("%d %m %Y", ymd); 
    return !in.fail(); 
} 

使用例:

int 
main() 
{ 
    std::cout << is_DMY("30 09 2017") << '\n'; 
    std::cout << is_DMY("31 09 2017") << '\n'; 
} 

出力:OPの最初の試験は、その

1 
0 

これが実証します"31 09 2017"は0です。 9月には30日しかありません。

関連する問題