2010-11-07 67 views
0

我今天刚刚开始C++。我正在做一些简单的注册程序。我想验证输入。验证全名和birth_date时,我卡住了。这里是我的要求:在C++中验证字符串和日期输入?

  • 全名:我只是想检查其空的,没有标点符号
  • date_birth:我知道这是升技棘手。但是如果我可以验证输入是否有效,如:月(1-12),日期(1-30)和年份(不超过当年)应该足够。

任何快速的方法来做到这一点?

编辑:

我试着用Google搜索字符串的验证,我仍然获得了大量的错误。这里是我当前的代码:

string fullname; 
do{ 
    cout << endl << "Please enter your fullname"; 
    cin >> fullname; 
} while(!ispunct(fullname)); 

我的错误信息是:

XXXX: no matching function for call to `ispunct(std::string&)' 

我已经包括图书馆,这是一个正确的方法来检查字符串输入。你通常如何进行验证?

编辑2:

bool valid; 
string fullname; 
do{ 
    valid = true; 
    cout << endl << "Please enter your fullname"; 
    cin >> fullname; 
    string::iterator it; 

     for (it=fullname.begin() ; it < fullname.end(); it++) 
      if(ispunct(*it)){ 
       valid = false; 
      } 
} while(!ispunct(fullname)); 

它的怪异,我进入: “!!!”,但它仍然被通过。我的代码中有什么错误?

回答

2

那么,我会尽量引导你在正确的方向。首先,为了验证字符串,你需要逐个字符地遍历它。您可以使用迭代器和for循环执行此操作。字符串类有一个begin()end()方法,您可以使用该方法遍历整个字符串并检查每个字符。

一旦你遍历字符串,你需要做的就是编写代码来根据你的需求来验证它。为了确保没有标点符号,您可以使用std::ispunct函数,该函数会告诉您一个字符是否是标点符号。如果您发现任何标点符号,请将其视为错误。

您的第一个要求,检查字符串是否为空,是微不足道的。字符串类有一个empty()方法,如果字符串为空,则返回true。

验证生日是比较棘手的。这是正则表达式的一些东西。不幸的是,C++没有内置的正则表达式支持(至少直到下一版本的标准)。如果你有兴趣,Boost在此期间有一个很好的正则表达式库。

否则,您需要遍历字符串并验证每个字符。确保字符串以形成与月份名称对应的字符的字符开头,然后确保括号后面有括号,等等。您需要决定如何处理字符之间的空格。这将会很棘手,但熟悉C++是一个很好的练习练习。

+0

哦,谢谢。所以我存储在字符数组而不是字符串数据类型? – 2010-11-07 18:13:26

+0

@cpp_is_cool,不,你一定要使用'std :: string'。但'std :: string'基本上是内部字符数组。例如,如果你有'std :: string s',并且你说'[3]',它会返回字符串中的第四个'char'。同样,当你迭代字符串时,每次你取消引用迭代器,你都会得到一个单独的字符。 – 2010-11-07 18:15:38

+0

哦..我不知道。 1个快速问题,如果我的字符串是“abcdefg”,有没有一种方法来确定大小?如果不是,我该如何声明for循环。 for(int i = 0; i 2010-11-07 18:17:55

0

如果您选择不同的数据类型来表示出生日期,则第二个需求的解决方案可能很简单。你在这里提到的限制是所有数字(1 < =日期< = 31,1 < =月< = 12,1900年< =年< = 2010年)和出生日期基本上是一组三个数字,所以考虑使用结构类型为birth_date变量,像这样:

struct Date{ 
    unsigned int day; 
    unsigned int month; 
    unsigned int year; 
}; 

Date birth_date = {3, 12, 1983}; 

当你传递birth_date到执行验证功能,你只需要结构成员对限额比较。