在c ++中验证字符串和日期输入?

时间:2010-11-07 18:03:07

标签: c++ validation

我今天刚开始使用c ++。我正在做一些简单的注册程序。我想验证输入。我在验证fullname和birth_date时遇到困难。这是我的要求:

  • 全名:我只想检查它是否为空且没有标点符号
  • date_birth:我知道这很狡猾。但如果我能验证输入是否有效,如:月(1-12),日期(1-30)和年份(不超过当前年份)应该足够了。

任何快速的方法吗?

编辑:

我尝试使用谷歌搜索字符串验证,我仍然遇到很多错误。这是我目前的代码:

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 个答案:

答案 0 :(得分:2)

好吧,我会试着引导你朝着正确的方向前进。首先,为了验证字符串,您需要逐个字符地迭代它。您可以使用迭代器和for循环来完成此操作。字符串类有一个begin()end()方法,您可以使用它来遍历整个字符串并检查每个字符。

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

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

验证生日更加棘手。这是正则表达式的一种东西。不幸的是,C ++没有内置的正则表达式支持(至少在标准的下一个版本之前)。如果您有兴趣,Boost同时有一个很好的正则表达式库。

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

答案 1 :(得分:0)

如果您选择不同的数据类型来表示出生日期,则第二个要求的解决方案可能很简单。你在这里提到的约束都是数字(1&lt; = day&lt; = 31,1&lt; = month&lt; = 12,1900&lt; = year&lt; = 2010),出生日期基本上是一组三个数字所以考虑对birth_date变量使用struct类型,如下所示:

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

Date birth_date = {3, 12, 1983};

当您将birth_date传递给执行验证的函数时,您只需要将struct成员与限制进行比较。