我有一个读取信用卡号的程序。我想添加一些东西,确保添加16个数字,没有字母,以及所需的空格(尽管它们不计入数字)。是否有一个函数或一组函数来执行此操作,或者我应该只使用isdigit()和isalpha()的循环,一次一个元素通过数组?
char cardNum[32];
cout << "Enter credit card number: ";
cin.getline(cardNum, 32); //Read in the entire line for the name
答案 0 :(得分:2)
你可以做很多事情。一个想法是将std::find_if
与自定义谓词一起使用。例如:
bool IsCharIllegal(char ch)
{
// return true or false based on whatever your exact requirements are
}
然后:
auto itFound = std::find_if(cardNum, cardNum + 32, IsCharIllegal);
if(itFound != cardNum + 32)
// invalid character was entered!
还有一种情况是使用std::string
而不是原始char
数组:
std::string cardNum;
cout << "Enter credit card number: ";
std::cin >> cardNum;
其次是:
auto itFound = std::find_if(cardNum.begin(), cardNum.end(), IsCharIllegal);
if(itFound != cardNum.end())
// invalid character was entered!
这有助于避免魔法32
并且还允许输入任何长度。
答案 1 :(得分:1)
我会使用正则表达式来匹配这个模式。如果您使用的是C ++ 11,则可以使用内置标题:http://www.cplusplus.com/reference/regex/
否则,请查看您可以使用的替代库:C++: what regex library should I use?
不幸的是,我对正则表达式并不是很擅长,但以下内容应匹配16个数字,中间有空格。
(\d[ ]*){16}
如果你正在寻找关于正则表达式的更多信息,这里有一个我经常使用的好的备忘单:http://regexlib.com/CheatSheet.aspx
我还想使用此网站测试我的表达式:http://regexpal.com/
答案 2 :(得分:1)
这样的话会被允许吗?
"123 456 789 01 23456"
使用std::string
和独立的std::getline
功能。它比同名的成员函数更好,因为它不会强迫你处理指针。
std::string line;
std::getline(std::cin, line);
if (!std::cin)
{
// catastrophic input failure
}
然后你有一个字符串,如上面line
中的例子。您可以使用std::find_if
来验证没有非法字符和std::count_if
以确保正好有16位数字,但我认为编写自己的循环(而不是“一堆循环”)会产生更多可读性代码在这里。
顺便说一句,要小心isdigit
!由于历史原因,您必须将其参数强制转换为unsigned char
才能安全使用它。
答案 3 :(得分:0)
atoll
中有cstdlib
个功能。 http://www.cplusplus.com/reference/cstdlib/atoll/
它将字符串输入转换为long long
,它可以存储一个16位长的信用卡号,但是只要输入中有非数字字符就会退出,所以
atoll("123456abc890")
会返回123456
如果要逐个字符检查每个字符,可以在每个字符上使用atoi
,然后为每个传递的字符重新组合字符串。
http://www.cplusplus.com/reference/cstdlib/atoi/