2012-02-14 116 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 2012-02-14 06:33:53

+1

或者只是在不需要的时候使用C字符串,并且完全避免使用C字符串。 – Duck 2012-02-14 06:39:20

回答

4

在一个非常高的水平,这是我建议:

  • 不要使用全球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 2012-02-15 04:49:56

0

一般来说,像static string input全局变量不是一个良好的编码习惯。我会做这样的事情:

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

你的情况:

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 
} 

注意,有两个(记录)怪癖:

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文档的确切表示更多的信息。