需要更改c ++代码

时间:2012-02-14 06:15:54

标签: c++

我写了这个代码用于日期验证..它工作正常..但我需要发送一个字符串,应该进入此函数并验证字符串并将其返回。我怎么能改变代码...

如果我删除静态并使用原型变量,我没有得到所需的输出..对于ex ..

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;
        }

4 个答案:

答案 0 :(得分: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;
    }
}

答案 1 :(得分: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
}

答案 2 :(得分: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;
    }
}

答案 3 :(得分: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文档,了解有关确切表示的更多信息。