如何安排循环检查数字

时间:2014-04-25 20:54:58

标签: c++ cstring ctype

我有一个读取信用卡号的程序。我想添加一些东西,确保添加16个数字,没有字母,以及所需的空格(尽管它们不计入数字)。是否有一个函数或一组函数来执行此操作,或者我应该只使用isdigit()和isalpha()的循环,一次一个元素通过数组?

char cardNum[32];
cout << "Enter credit card number: ";
cin.getline(cardNum, 32); //Read in the entire line for the name

4 个答案:

答案 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/