我正在尝试编写一个检查15-16位输入的程序,看看它们属于哪个银行。我不熟悉我正在编写的语言(c ++),并且想要一些指针。我知道你不能在没有其余代码的情况下进行复制和粘贴,但是要发布所有代码都是很长的。我只需要对一些事情进行一些调整。
现在我有程序检查输入的长度以及字符串的前两个值是什么。我想知道现在有没有比现在更简单的方法了。
if(cLen==15 && c[0]== 3 && c[1]==4)
和
if(cLen==15 && c[0]== 3 && c[1]==7)
因为我需要的是找到前两个nums为34或37的字符串
其次我需要检查字符串是否具有51到55的第一个值
最后我需要检查字符串是否在开头包含6011。
string validatebankcc(string c, int cLen, bool& ccOK) {
string bankcc;
if(cLen==15 && c[0]== 3 && c[1]==4)
bankcc = "AmericanExpress";
if(cLen==15 && c[0]== 3 && c[1]==7)
bankcc = "AmericanExpress";
if(cLen==16 && "6011 in beginning")
bankcc = "Discover";
if(cLen==16 && c[0]==5 && c[1]==1)
bankcc="MasterCard";
if(cLen==16 && c[0]==5 && c[1]==5)
bankcc="MasterCard";
if(c[0]==4)
bankcc="Visa";
else
bankcc = "Uknown Bank"
return bankcc;
答案 0 :(得分:2)
bool got_length_and_prefix(string s, int desired_length, string desired_prefix) {
if (s.length() != desired_length) return false;
if (s.find(desired_prefix) != 0) return false;
return true;
}
string validatebankcc(string c, int /* cLen useless here*/, bool& ccOK) {
ccOK = true;
if (got_length_and_prefix(c, 15, "34")) return "AmericanExpress";
if (got_length_and_prefix(c, 15, "37")) return "AmericanExpress";
if (got_length_and_prefix(c, 16, "6011")) return "Discover";
if (got_length_and_prefix(c, 16, "51")) return "MasterCard";
if (got_length_and_prefix(c, 16, "55")) return "MasterCard";
if (c[0] == '4') return "Visa";
ccOK = false;
return "Unkown Bank";
}
虽然总体设计不好。将银行名称作为字符串返回正在为麻烦而烦恼(这也导致无用的ccOK标志,可以用BANK_UNKNOWN替换或像这样的smth。将字符串长度与字符串一起传递,知道它的长度也闻起来像麻烦。
答案 1 :(得分:0)
if (c.find("6011") != string::npos && c.find("6011") == 0) //"6011" in beginning
{
}
答案 2 :(得分:0)
首先,您不需要传递字符串长度 - 有一个成员函数size()
。其次,你应该经过const &
。最后,您可以使用find_first_of
来简化此操作:
因此,您的方法将如下所示:
string validate_bank_cc(const string& c, bool& ccOk)
{
if((c.size() == 15) && (c.find_first_of("34") == 0))
return "AmericanExpress";
//etc...
}