C++ 如果字符串为';s开始时的规格值

C++ 如果字符串为';s开始时的规格值,c++,if-statement,C++,If Statement,我正试图编写一个程序,检查15-16位输入,看看它们属于哪个银行。我不熟悉我用的语言(c++),我想要一些指针。我知道如果没有其余的代码,你就无法复制和粘贴,但是发布所有的代码需要很长时间。我只需要在几件事上说声再见 现在我让程序检查输入的长度和字符串的前两个值。我想知道是否有比我现在拥有的更简单的方法 if(cLen==15 && c[0]== 3 && c[1]==4) 及 因为我只需要找到前两个num为34或37的字符串 其次,我需要检查字符串的第一个值是

我正试图编写一个程序,检查15-16位输入,看看它们属于哪个银行。我不熟悉我用的语言(c++),我想要一些指针。我知道如果没有其余的代码,你就无法复制和粘贴,但是发布所有的代码需要很长时间。我只需要在几件事上说声再见

现在我让程序检查输入的长度和字符串的前两个值。我想知道是否有比我现在拥有的更简单的方法

if(cLen==15 && c[0]== 3 && c[1]==4)

因为我只需要找到前两个num为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;

首先,您不需要传递字符串长度-有一个成员函数
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...
}

虽然整体设计不好。以字符串形式返回银行名称是非常麻烦的(这也会导致无用的ccOK标志,它可以被bank_UNKNOWN或smth这样的标志替换。将字符串长度与已知长度的字符串一起传递也会有问题。

我不知道“气味”我认为该方法应该返回一个enum,它的第一个值是unknown_bank(或其他任何值),这意味着您可以将此函数的返回值视为bool(除非您将其设置为其他值,否则enum的第一个值默认为零).
find\u first\u of
在您提供的搜索筛选器中查找任何字符。请改用
find
。获取第一个
所需前缀.size()
字符的子字符串而不是检查整个字符串可能会更快。此外,该逻辑表明“42”是有效的visa卡号,这非常棒,但不幸的是,不是真的。@iced,您仍然会保留长度检查。这只是一个替换整个字符串的想法。对于如此短的字符串,它实际上并不重要。@chris string::length不循环字符串,它保留预先计算的长度(在任何情况下,正如您所说,这对于如此短的字符串都是无用的)。第一个检查是多余的。如果它等于0,它将不等于
std::string::npos
if (c.find("6011") != string::npos && c.find("6011") == 0) //"6011" in beginning
{
}
string validate_bank_cc(const string& c, bool& ccOk) 
{
    if((c.size() == 15) && (c.find_first_of("34") == 0))
        return "AmericanExpress";
    //etc...
}
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";
}