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

How do I validate this string in C++?

本文关键字:验证 字符串 C++      更新时间:2023-10-16

一个人被要求输入他们的信用卡号,它必须有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 numbert Enter 4 numbers followed by a space or -ntt";
      cin >> creditcardnum;
      if(validcreditcardnum==false){
         cout<<"Your credit card number is invalidntt";
      }
      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;
    }

此表达式可编译,但不正确:

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++)

对这四个变量中的任何一个写一个检查就足够了,因为它们都在同一点上递增。考虑用一个索引重写这个循环,并在执行过程中添加一个"偏移量"(或者使用嵌套循环作为偏移量)。

您的原始代码还有许多其他问题。

我修改了你的代码,让它做你想做的事。它不优雅,但应该有效。它对我有用。

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 invalidnn";
        validcreditcardnum = true;
    }
    cout << "Enter your credit card numbert Enter 4 numbers followed by a space or -ntt";
    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;
}

思考如何将此问题分离为更简单的子问题。一个显而易见的方法是检查std::string对象是否以四位数字开头。另一个是检查std::string对象是否以空格或破折号开头。编写这两个函数,并使用它们来验证信用卡号。如果它以四位数字开头,请删除这四位数字;然后检查它是以空格还是破折号开头,如果是,请删除第一个字符。重复直到完成。

我建议将信用卡号视为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;  

在底部,您对validcreditcardnum有效性标志的测试是不正确的。

if(validcreditcardnum=true)

它应该是if(validcreditcardnum==true)。否则,您将不会收到输出消息"信用卡号正确"。

你可以试试这样的。。。

如果长度不等于19bool是错误的

循环计数达到19或小于20如果到达49或第14位,则在计数上加1如果计数上的位置不等于数字,则bool等于false闭环

循环计数最多为19,但五人一组如果计数的位置不等于您的要求bool false关闭循环