if语句-if/else和参数放置C++
if statement - if/else and parameter placement C++
我最近开始学习C++,并试图理解语法,但我遇到了放置问题。我必须做一个信用卡验证功能,要求提供一张有效的信用卡,然后我必须打印出信用卡的类型。
我唯一的问题是确定信用卡类型的if语句。我不知道把它们放在哪里,也不知道我是否遗漏了括号之类的东西。
对我来说有问题的确切部分是:
if(c.substr(0, 2) == "65" || c.substr(0, 5) == "6011" || c.substr(0, 7) >= "622126" && c.substr(0, 7) <= "622925" || c.substr(0, 4) >= "644" && c.substr(0, 4) <= "649")
s = "You have a Discover card";
if(c.substr(0, 2) >= "51" && c.substr(0, 2) <= "55")
s = "You have a MasterCard card";
if(c.substr(0, 1) == "4")
s = "You have a Visa card";
if(c.substr(0, 2) == "34" || c.substr(0, 2) == "37")
s = "You have an American Express card";
这是我的密码。
#include <iostream>
#include <string>
using namespace std;
void validateCC();
string checkCC(string, int, bool&);
bool validateCCNum(string);
void main() {
char again;
cout << "Validate a credit card number (Y/N)? ";
cin >> again;
while (toupper(again) == 'Y') {
validateCC();
cout << "Validate a credit card number (Y/N)? ";
cin >> again;
}
}
void validateCC() {
string ccn, msg;
bool OK;
int ccLen;
cout << "Please enter a 15 or 16 digit credit card number."
<< "n(No spaces or hyphens): ";
cin >> ccn;
ccLen = ccn.length();
msg = checkCC(ccn, ccLen, OK);
if(!OK)
cout << msg;
else
if(validateCCNum(ccn))
cout << "Valid credit card numbern";
else
cout << "Invalid credit card numbern";
cout << "n" << endl;
}
string checkCC(string c, int cLen, bool& ccOK) {
string s = "";
ccOK = true;
for(int i=0;i<cLen && ccOK;++i)
ccOK = isdigit(c[i]);
if(c.substr(0, 2) == "65" || c.substr(0, 5) == "6011" || c.substr(0, 7) >= "622126" && c.substr(0, 7) <= "622925" || c.substr(0, 4) >= "644" && c.substr(0, 4) <= "649")
s = "You have a Discover card";
if(c.substr(0, 2) >= "51" && c.substr(0, 2) <= "55")
s = "You have a MasterCard card";
if(c.substr(0, 1) == "4")
s = "You have a Visa card";
if(c.substr(0, 2) == "34" || c.substr(0, 2) == "37")
s = "You have an American Express card";
if(ccOK == false) {
s = "Invalid credit card number digits";
} else if(cLen == 15) {
if(c.substr(0, 2) != "34" && c.substr(0, 2) != "37") {
ccOK = false;
s = "Invalid American Express credit card number";
}
} else if(cLen != 16) {
ccOK = false;
s = "Invalid credit card number length";
}
return s;
}
bool validateCCNum(string cc) {
bool flip = true;
int tmp, num = 0;
int ccLen = cc.length()-1;
for(int ndx=ccLen;ndx>=0;ndx--) {
if(flip)
num += cc[ndx] - '0';
else {
tmp = (cc[ndx] - '0') * 2;
if(tmp <= 9)
num += tmp;
else
num += (1 + (tmp - 10)); // max of 18
}
flip = !flip;
}
return num % 10 == 0;
}
我不知道有问题的区块是否属于它当前所在的位置,或者我是否将它放在validateCC((部分,然后为它添加一个参数
谢谢。
尝试将子字符串更改为int(stringVar>>IntVar;(,以便计算<=>=等等。
#include <iostream>
#include <string>
using namespace std;
void validateCC();
string checkCC(string, int, bool&);
bool validateCCNum(string);
void main() {
char again;
cout << "Validate a credit card number (Y/N)? ";
cin >> again;
while (toupper(again) == 'Y') {
validateCC();
cout << "Validate a credit card number (Y/N)? ";
cin >> again;
}
}
string checkCardType(string c){
if(atoi(c.substr(0, 2).c_str()) == 65 || atoi(c.substr(0, 5).c_str()) == 6011 || atoi(c.substr(0, 7).c_str()) >= 622126 && atoi(c.substr(0, 7).c_str()) <= 622925 || atoi(c.substr(0, 4).c_str()) >= 644 && atoi(c.substr(0, 4).c_str()) <= 649)
return "You have a Discover card";
if(atoi(c.substr(0, 2).c_str()) >= 51 && atoi(c.substr(0, 2).c_str()) <= 55)
return "You have a MasterCard card";
if(atoi(c.substr(0, 1).c_str()) == 4)
return "You have a Visa card";
if(atoi(c.substr(0, 2).c_str()) == 34 || atoi(c.substr(0, 2).c_str()) == 37)
return "You have an American Express card";
return "Card not recognized";
}
void validateCC() {
string ccn, msg;
bool OK;
int ccLen;
cout << "Please enter a 15 or 16 digit credit card number."
<< "n(No spaces or hyphens): ";
cin >> ccn;
ccLen = ccn.length();
msg = checkCC(ccn, ccLen, OK);
if(!OK)
cout << msg;
else
if(validateCCNum(ccn)){
cout << "Valid credit card numbern";
cout << checkCardType(ccn);}
else
cout << "Invalid credit card numbern";
cout << "n" << endl;
}
string checkCC(string c, int cLen, bool& ccOK) {
string s = "";
ccOK = true;
for(int i=0;i<cLen && ccOK;++i)
ccOK = isdigit(c[i]);
if(ccOK == false) {
s = "Invalid credit card number digits";
} else if(cLen == 15) {
if(c.substr(0, 2) != "34" && c.substr(0, 2) != "37") {
ccOK = false;
s = "Invalid American Express credit card number";
}
} else if(cLen != 16) {
ccOK = false;
s = "Invalid credit card number length";
}
return s;
}
bool validateCCNum(string cc) {
bool flip = true;
int tmp, num = 0;
int ccLen = cc.length()-1;
for(int ndx=ccLen;ndx>=0;ndx--) {
if(flip)
num += cc[ndx] - '0';
else {
tmp = (cc[ndx] - '0') * 2;
if(tmp <= 9)
num += tmp;
else
num += (1 + (tmp - 10)); // max of 18
}
flip = !flip;
}
return num % 10 == 0;
}
我真的不确定这是否有效:
c.substr(0,2(=="34">
为什么不将字符串解析为整数(atoi(,然后将其与"=="进行比较呢。字符串也与"string".compare("string2"(进行比较(如果是相同的字符串,则返回0(。
虽然不是最有效的方法,但我在您的代码中看到的问题是您占用了太多某些情况下的字符:c.substr(0, 5) == "6011"
可以仅当CCD_ 2。
值得一提的是,我将前缀声明为static
std::string const
,并在它们上使用std::equal
(在第一个已经检查了该数字是否足够长(。或者,我会在第一个字符上使用开关:
switch (c[0])
{
case '6':
// Additional tests for Discover...
break;
case '5':
// Additional tests for MasterCard...
break;
case '4':
// Additional tests for Visa...
break;
case '3':
// Additional tests for American express..
break;
}
或者更可能的是,我会使用正则表达式从配置文件读取的模式;这是而不是类型要硬编码到程序中的信息。
std::string::substr
方法返回一个字符串,该字符串可以与另一个字符串进行比较。到目前为止,您的代码看起来不错。
关于使用括号,请查看C++运算符优先级。根据我对代码的理解,if条件中不需要括号。但如果你有疑问,请使用括号明确你的意图。
您不需要传递信用卡号的长度,因为checkCC
可以自己确定。还将信用卡号作为传递
string checkCC(const string &c, ...)
因为这样可以避免字符串的副本。
- 如何反转整数参数包
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 函数调用中参数的顺序重要吗
- 部分定义/别名模板模板参数
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 使用不带参数的函数访问结构元素
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 如何使用Luacneneneba API正确读取字符串和表参数
- 在派生函数中指定void*参数
- 视图中的参数推导失败:take_while
- static_assert在宏中,但也可以扩展到可以用作函数参数的东西
- 使用指向成员的指针将成员函数作为参数传递
- 没有名称的C++模板参数
- 如何将enable-if与模板参数和参数包一起使用