我今天刚开始使用c ++。我正在做一些简单的注册程序。我想验证输入。我在验证fullname和birth_date时遇到困难。这是我的要求:
任何快速的方法吗?
编辑:
我尝试使用谷歌搜索字符串验证,我仍然遇到很多错误。这是我目前的代码:
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));
很奇怪,我进入了:“!!!”,它仍然是合格的。我的代码出了什么问题?
答案 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成员与限制进行比较。