如何在C ++中验证此字符串?

时间:2013-12-14 18:26:54

标签: c++ string

要求某人输入他们的信用卡号码,必须有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;
    }

6 个答案:

答案 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个,但是以五个为一组     如果计数的位置不等于你的要求     布尔假 关闭循环