要求某人输入他们的信用卡号码,必须有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 number\t Enter 4 numbers followed by a space or -\n\t\t";
cin >> creditcardnum;
if(validcreditcardnum==false){
cout<<"Your credit card number is invalid\n\t\t";
}
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;
}
答案 0 :(得分:2)
此表达式编译,但不正确:
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++)
对四个变量中的任何变量进行检查就足够了,因为它们都在同一点上递增。考虑使用单个索引重写此循环,并在其中添加“偏移”(或使用嵌套循环进行偏移)。
答案 1 :(得分:0)
考虑如何将此问题分解为更简单的子问题。一个显而易见的是检查std::string
对象是否以四位开头。另一种方法是检查std::string
对象是以空格还是短划线开头。编写这两个函数,并使用它们来验证信用卡号。如果它以四位数字开头,则删除四位数字;然后检查它是以空格还是破折号开头,如果是,则删除第一个字符。重复直到完成。
答案 2 :(得分:0)
我建议将信用卡号码视为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;
答案 3 :(得分:0)
在底部,您对validcreditcardnum有效性标志的测试不正确。
if(validcreditcardnum=true)
应该是if(validcreditcardnum == true)。否则,您将无法获得输出消息“信用卡号码正确”。
答案 4 :(得分:0)
您的原始代码还有许多其他问题。
我修改了你的代码,让它做你想做的事。它不优雅,但应该工作。它对我有用。
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 invalid\n\n";
validcreditcardnum = true;
}
cout << "Enter your credit card number\t Enter 4 numbers followed by a space or -\n\t\t";
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;
}
答案 5 :(得分:0)
你可以试试这样的......
如果长度不等于19 布尔是假的
for循环计数最多19或小于20 如果到4 9或14位置加1计数 如果计数位置不等于数字那么 布尔等于假 关闭循环
用于循环计数,最多19个,但是以五个为一组 如果计数的位置不等于你的要求 布尔假 关闭循环