2012-02-14 32 views
-1

日付の検証のためにこのコードを書いています..うまくいきますが、文字列を送信する必要があり、この関数に入り、文字列を検証して戻す必要があります。私は、静的削除し、私は元のための所望の出力..を取得していない午前プロトタイプ変数を使用している場合どのように私は上記の形式で必要な.. ...C++コードを変更する必要があります

main() 
{ 

dobvalidation(b); 

} 

void dobvalidation(string b) 
{ 
//validates 
} 

を、コードを変更することができます。これは私ですコードは非常に高いレベルで

#include <iostream> 
#include <string> 
#include <cstring> 
#include <stdlib.h> 
#include <ctime> 
using namespace std; 
void checkFormat(); 
void dobValidation(); 
static string input; 
int main() 
{ 
    cout<<"Enter date of birth (dd-mm-yyyy)\n"; 
    getline(cin,input,'\n'); 
    checkFormat(); 
dobValidation(); 
    return 0; 
} 

void checkFormat() 
{ 

    //check the length of the string 
    int len=input.size(); 
    if(len!=10) 
    { 
     cout<<"\nPlease enter a valid Date of Birth\n"; 
     cin>>input; 
     checkFormat(); 
     return; 
    } 

    char * val; 
    val = const_cast<char*>((input.substr(2,1)).c_str()); 

    //check for the dashes in dob 
    if(strcmp(val,"-")!=0) 
    { 
     cout<<"\nPlease enter a valid Date of Birth\n"; 
     cin>>input; 
     checkFormat(); 
     return; 
    } 

     val = const_cast<char*>((input.substr(5,1)).c_str()); 

    if(strcmp(val,"-")!=0) 
    { 
     cout<<"\nPlease enter a valid Date of Birth\n"; 
     cin>>input; 
     checkFormat();  
     return; 
    } 

    //check for digits 

    //extract date from string 

    char * date; 
    date = const_cast<char*>((input.substr(0,2)).c_str()); 
    //check char by char for numeric 
    char c; 
    for(int i=0;i<2;i++) 
    { 
     c = date[i]; 
     if(!isdigit(c)) 
     { 
      cout<<"\nPlease enter a valid Date of Birth\n"; 
      cin>>input; 
      checkFormat(); 
      return; 
     } 

    } 

    //extract month from string 

    char * month; 
    month = const_cast<char*>((input.substr(3,2)).c_str()); 

    //check char by char for numeric  
    for(int i=0;i<2;i++) 
    { 
     c = month[i]; 
     if(!isdigit(c)) 
     { 
      cout<<c; 
      cout<<"\nPlease enter a valid Date of Birth\n"; 
      cin>>input; 
      checkFormat(); 
      return; 
     } 

    } 

    //extract year from string 
    char * year; 
    year = const_cast<char*>((input.substr(6,4)).c_str()); 

    //check char by char for numeric  
    for(int i=0;i<4;i++) 
    { 
     c = year[i]; 
     if(!isdigit(c)) 
     { 
      cout<<"\nPlease enter a valid Date of Birth\n"; 
      cin>>input; 
      checkFormat(); 
      return; 
     } 

    } 
return; 
} 



void dobValidation() 
{ 
//  cout<<dob; 
    //date 
     char * date1; 
     date1 = const_cast<char*>((input.substr(0,2)).c_str()); 
     int dd=atoi(date1); 

     //month 
     char * month1; 
     month1 = const_cast<char*>((input.substr(3,2)).c_str()); 
     int mm=atoi(month1); 

     //year 
     char * year1; 
     year1 = const_cast<char*>((input.substr(6,4)).c_str()); 
     int yyyy=atoi(year1); 

    //cout<<dd<<mm<<yyyy; 
     int days[12]={31,28,31,30,31,30,31,31,30,31,30,31}; 

     int max_no_of_day = days[mm-1]; 

     //check for leap year 

     if((yyyy%400 ==0 || (yyyy%100 != 0 && yyyy%4 == 0)) && mm==1) 
     { 
         max_no_of_day=29; 
     } 
     // check date doesnt cross the max limit 
     if(dd > max_no_of_day || dd<1) 
     { 
    // cout<<"max"<<max_no_of_day<<endl; 
    // cout<<dd<<mm<<yyyy; 
       cout<<"\nPlease enter a valid Date of Birth\n"; 
       cin>>input; 
       dobValidation(); 
     return; 
     } 

     // month validation 

     if(mm >12 || mm<1) 
     { 
       cout<<"\nPlease enter a valid Date of Birth\n"; 
       cin>>input; 
       dobValidation(); 
     return; 
     } 
//year verification 

     time_t t = time(0); // get time now 
    struct tm * now = localtime(& t); //convert to local time 
    int current_year = (now->tm_year + 1900); 
    int current_month = (now->tm_mon + 1); 
    int current_date = (now->tm_mday); 


    // date should not exceed current date 
    if(yyyy==current_year && mm>current_month) 
    { 
     cout<<"\nPlease enter a valid Date of Birth\n"; 
       cin>>input; 
       dobValidation(); 
     return; 
    } 

    if(yyyy==current_year && mm==current_month && dd>current_date) 
    { 
     cout<<"\nPlease enter a valid Date of Birth\n"; 
       cin>>input; 
       dobValidation(); 
     return; 
    } 

    //check whether year crossed current year 
    if(yyyy>current_year || yyyy<1900) 
    { 
     cout<<"\nPlease enter a valid Date of Birth\n"; 
       cin>>input; 
       dobValidation(); 
     return; 
    } 


return; 
     } 
+0

const_castを実行しないでください。あなたの変数を 'char *'から 'const char *'に変更してください。 – balki

+1

また、必要がないときにC文字列を使用せず、キャストを完全に避けてください。 – Duck

答えて

4

は、ここで私は示唆しているものです:

  • グローバル0123を使用しないでください。入力をパラメータとして関数に渡します。

  • 関数を再帰的に呼び出すことは避けてください。あなたの関数から成功/失敗の結果を返し、メインループに何をすべきかを決定させます。

たとえば、あなたのメインループは次のようになります。static string inputよう

int main() 
{ 
    while (true) { 
     cout<<"Enter date of birth (dd-mm-yyyy)\n"; 
     string input; 
     getline(cin,input,'\n'); 
     if (!checkFormat(input)) { 
      cout<<"\nPlease enter a valid Date of Birth\n"; 
      continue; 
     } 
     if (!dobValidation(input)) { 
      cout<<"\nPlease enter a valid Date of Birth\n"; 
      continue; 
     } 
     cout << "thanks.\n"; 
     break; 
    } 
} 
+0

ええ、私は理解する..私は試してみるよ – srinathmkce

0

一般的に言って、グローバル変数が良いコーディングプラクティスではありません。私は次のようなことをします:

main() { 
    string input; 
    bool isValid = false; 

    cout<<"Enter date of birth (dd-mm-yyyy)\n"; 
    getline(cin,input,'\n'); 

    while(!checkFormat(input) || !dobValidation(input)) { 
     cout<<"Please enter a valid date of birth (dd-mm-yyyy)\n"; 
     getline(cin,input,'\n');   
    } 
    return 0; 
} 

bool checkFormat(string input) { 
    // return true if format is valid, false otherwise 
} 

bool dobValidation(string input) { 
    // return true if dob is valid, false otherwise 
} 
0

下位レベルでは、C++に固執することで多くを単純化することができます。例えば

//extract year from string 
char * year; 

year = const_cast<char*>((input.substr(6, 4)).c_str()); 

//check char by char for numeric 
for (int i = 0;i < 4;i++) 
{ 
    c = year[i]; 

    if (!isdigit(c)) 
    { 
     cout << "\nPlease enter a valid Date of Birth\n"; 
     cin >> input; 
     checkFormat(); 
     return ; 
    } 

} 

のようなものは

//check year for numerics 
for (int i = 6; i < 10; i++) 
{ 
    if (! isdigit(input[i])) 
    { 
     return false; 
    } 
} 
0

グレッグになることができますあなたのトップレベルを与えたので、私はガッツのための正しい方向にあなたを指します:strptime

これはUnixユーティリティですが、Windowsのサポートに興味がある場合は、おそらく同等の機能があります。

使用するフォーマット文字列は、姉妹のstrftimeと似ていますが、consulted hereにすることができます。

tm.tm_year // number of years since 1900 
tm.tm_mon // month in [0..11] (where 0 is January and 11 is December) 

が正確な表現の詳細についてはstruct tmドキュメントを読む:2(文書化)癖があること

bool checkFormat(std::string const& str, tm& date) { 
    char const* const s = strptime(str.c_str(), "%d-%m-%Y", &date); 
    return s != NULL; // NULL indicates failure 
} 

注:お使いの場合には

関連する問題