如何在C++中验证此字符串
How do I validate this string in C++?
一个人被要求输入他们的信用卡号,它必须有16位数字,每4位数字之后,它有一个空格或-
我有代码来检查是否有空格或连字符,以及检查那个人是否输入了字母。
此代码的问题在于:当我输入字母时,它会说超出范围,当我输入的长度小于我设置的长度时,它也会说输入是正确的。你知道我哪里错了吗?
#include<iomanip>
#include <iostream>
#include<conio.h>
using namespace std;
int main () {
string creditcardnum;
bool validcreditcardnum;
do{
validcreditcardnum=true;
cout << "Enter your credit card numbert Enter 4 numbers followed by a space or -ntt";
cin >> creditcardnum;
if(validcreditcardnum==false){
cout<<"Your credit card number is invalidntt";
}
if (creditcardnum.length ()!=19){
validcreditcardnum==false;
}
for(unsigned short a= 0,b=5, c=10, d=15;
a<=3,b<=8,c<=13,d<=18;
a++, b++, c++, d++){
if(!isdigit(creditcardnum.at(a))&&
!isdigit(creditcardnum.at(b))&&
!isdigit(creditcardnum.at(c))&&
!isdigit(creditcardnum.at(d))
)
validcreditcardnum==false;
}
if(
creditcardnum.at (4) !=' '||'-'&&
creditcardnum.at (9) !=' '||'-'&&
creditcardnum.at (14)!=' '||'-'){
validcreditcardnum==false;
}
while(validcreditcardnum==false);
if(validcreditcardnum=true)
cout << "Credit card number is correct";
return 0;
}
此表达式可编译,但不正确:
creditcardnum.at (4) !=' '|| '-' && ...
上面的表达式总是true
,因为逻辑OR运算符||
将所有非零值视为true
。
您可以将表达式重写如下:
creditcardnum.at (4) !=' ' && creditcardnum.at (4) !='-' && ...
此外,您在不需要逗号运算符的地方使用逗号运算符:
for(unsigned short a= 0,b=5, c=10, d=15;
a<=3,b<=8,c<=13,d<=18; // <<== Here
a++, b++, c++, d++)
对这四个变量中的任何一个写一个检查就足够了,因为它们都在同一点上递增。考虑用一个索引重写这个循环,并在执行过程中添加一个"偏移量"(或者使用嵌套循环作为偏移量)。
您的原始代码还有许多其他问题。
我修改了你的代码,让它做你想做的事。它不优雅,但应该有效。它对我有用。
int main()
{
string sCreditcardnum;
char szCreditCardNum[100];
memset(szCreditCardNum, 0, sizeof szCreditCardNum);
bool validcreditcardnum = true;
do {
if(validcreditcardnum == false) {
cout << "The credit card number provided is invalidnn";
validcreditcardnum = true;
}
cout << "Enter your credit card numbert Enter 4 numbers followed by a space or -ntt";
cin.getline(szCreditCardNum, 30);
sCreditcardnum = szCreditCardNum;
if (sCreditcardnum.length () != 19)
validcreditcardnum = false;
for(unsigned short a=0, b=5, c=10, d=15;
a<=3,b<=8,c<=13,d<=18;
a++, b++, c++, d++)
{
if(!isdigit(sCreditcardnum.at(a)) ||
!isdigit(sCreditcardnum.at(b)) ||
!isdigit(sCreditcardnum.at(c)) ||
!isdigit(sCreditcardnum.at(d)))
{
validcreditcardnum = false;
break;
}
}
if( (sCreditcardnum.at (4) != ' ' && sCreditcardnum.at (4) != '-') ||
(sCreditcardnum.at (9) != ' ' && sCreditcardnum.at (9) != '-') ||
sCreditcardnum.at (14) != ' ' && sCreditcardnum.at (14) != '-')
{
validcreditcardnum = false;
}
}
while(validcreditcardnum == false);
if(validcreditcardnum == true)
cout << "Credit card number is correct";
return 0;
}
思考如何将此问题分离为更简单的子问题。一个显而易见的方法是检查std::string
对象是否以四位数字开头。另一个是检查std::string
对象是否以空格或破折号开头。编写这两个函数,并使用它们来验证信用卡号。如果它以四位数字开头,请删除这四位数字;然后检查它是以空格还是破折号开头,如果是,请删除第一个字符。重复直到完成。
我建议将信用卡号视为4个数字,而不是一个字符串或一组字符串。
C++输入函数将读取字符,构建一个数字,直到找到一个非数字字符。这意味着当遇到数字组之间的空格、短划线或连字符时,它将停止。
要验证组号的长度为4位,请检查范围:
if ((group_number > 999) && (group_number < 10000))
{
// group number has 4 digits
}
读取信用卡号码可以简单到:
int group1;
int group2;
int group3;
int group4;
cin >> group1 >> group2 >> group3 >> group4;
if (group1 < 0) group1 *= -1; // Turn into a positive number
if (group2 < 0) group2 *= -1;
if (group3 < 0) group3 *= -1;
if (group4 < 0) group4 *= -1;
在底部,您对validcreditcardnum有效性标志的测试是不正确的。
if(validcreditcardnum=true)
它应该是if(validcreditcardnum==true)。否则,您将不会收到输出消息"信用卡号正确"。
你可以试试这样的。。。
如果长度不等于19bool是错误的
循环计数达到19或小于20如果到达49或第14位,则在计数上加1如果计数上的位置不等于数字,则bool等于false闭环
循环计数最多为19,但五人一组如果计数的位置不等于您的要求bool false关闭循环
- 输入验证以筛选出字符、字符串和一系列整数
- 如何编写将验证以下字符串的正则表达式?
- 如何正确实现 std::all_of 函数来验证字符串的一部分?
- 获取线函数未定义错误。无法在字符串中保存可验证的内容
- 如何对字符串变量应用验证,使其仅接受来自用户的字母数据?
- C 未验证字符串输入
- 如何验证用户将字符串输入到std :: cin中
- 在C++测试家庭作业问题中的字符串输入时无法退出循环(作为数据验证)
- 如何使用数组字符串进行输入验证
- C 验证字符串2中是否存在字符串1
- 转换和验证字符串
- 验证字符串中是否存在无效字符
- 如何验证字符串是有效的双精度(即使它有一个点)
- 验证字符串是否为回文的函数
- 通过数字和冒号验证字符串
- 验证字符串是否至少包含一个字母
- 验证字符串是否为全数字
- 如何验证字符串是否为数字和/或允许一个字符"."
- 如何使用RegExp验证字符串表达式
- 在短范围内验证字符串