信用卡号验证 用c++如何解决?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了信用卡号验证 用c++如何解决?相关的知识,希望对你有一定的参考价值。

当你输入信用卡号码的时候,有没有担心输错了而造成损失呢?其实可以不必这么担心,因为并不是一个随便的信用卡号码都是合法的,它必须通过Luhn算法来验证通过。

该校验的过程:

1、从卡号最后一位数字开始,逆向将奇数位(1、3、5等等)相加。

2、从卡号最后一位数字开始,逆向将偶数位数字,先乘以2(如果乘积为两位数,则将其减去9),再求和。

3、将奇数位总和加上偶数位总和,结果应该可以被10整除。

例如,卡号是:5432123456788881

则奇数、偶数位分布:5432123456788881

奇数位和=35

偶数位乘以2(有些要减去9)的结果:1 6 2 6 1 5 7 7,求和=35。

最后35+35=70 可以被10整除,认定校验通过。

请编写一个程序,从标准输入获得卡号,然后判断是否校验通过。通过显示:“成功”,否则显示“失败”。

比如,用户输入:356827027232780

程序输出:成功
我只会C++,C一点不懂.如能改为C++,本人感激不尽!最好注释详细一点!我是菜鸟

发现一个问题啊 输入卡号位数怎么不是确定的呢???算了 附上我的代码吧 刚做的

#include <cstdlib>
#include <iostream>
#include<string>

using namespace std;

void luhn(string string1)

int sum1=0;//奇数位和
int sum2=0;//偶数位和
for(int i=string1.size()-1;i>=0;i-=2)//suze()读取字符串长度
sum1+=int(string1[i])-48;//string[n] 读取第n位字符,好久没用过string了 记得有个函数是类型转换的 你上网查下吧 我这里没用函数 直接强制转换的

for(int j=string1.size()-2;j>=0;j-=2)


if(2*(int(string1[j])-48)>=10)
sum2=sum2+2*(int(string1[j])-48)-9;
else
sum2=sum2+(int(string1[j])-48)*2;

if((sum1+sum2)%10==0)
cout<<"成功."<<endl;
else
cout<<"失败"<<endl;



int main(int argc, char *argv[])

cout<<"请输入卡号:"<<endl;//题目中两个例子怎么卡号位数不一样啊?
string string1;
cin>>string1;
luhn(string1);
system("PAUSE");
return EXIT_SUCCESS;
参考技术A #include<stdio.h>
#include <string.h>

int ValidCard(char *s )

int nSumOdd,nSumEven,nLen,nCount,nTemp;
char *p;

nLen = strlen(s) ;
nSumOdd = 0,nSumEven=0;
for(p=s+nLen-1,nCount=1;p>=s;p--,nCount++)

if( nCount%2)
nSumOdd = nSumOdd + *p-'0'; //从卡号最后一位数字开始,逆向将奇数位(1、3、5等等)相加
else //从卡号最后一位数字开始,逆向将偶数位数字,先乘以2(如果乘积为两位数,则将其减去9),再求和。

nTemp = (*p-'0')*2;
if(nTemp>9)nTemp = nTemp-9;

nSumEven = nSumEven + nTemp;


if((nSumOdd+ nSumEven)%10) return 0;//将奇数位总和加上偶数位总和,结果应该可以被10整除
else return 1;


main()

char sCard[28];
printf("Intput the cardID:\n");
gets(sCard);
if( ValidCard(sCard) )
printf("成功\n");
else printf("失败\n");
getchar() ;
追问

这是用C做的,我要的是C++,不要糊弄我OK!

追答

我晕,有C标准语言,直接到C++中就可以用,相关方法直接转换成C++类的方法就可以了。

追问

大哥用C做,百度有现成的答案!我费这尽干啥!

使用正则表达式验证信用卡号

【中文标题】使用正则表达式验证信用卡号【英文标题】:Validating credit card number using regular expression 【发布时间】:2019-02-26 10:53:25 【问题描述】:

信用卡号格式为:“nnnn nnnn nnnn nnnn”

我用这个模式测试了下面四个字符串,但是 temp3 字符串意外返回 true。

我不知道怎么了。我正在使用的正则表达式应该准确地验证四位数字和一个空格,但是 temp3 尽管不匹配此模式,但仍返回 true。

String temp1 = " adfs 1111 2222 3333 4444 fadad";  // outer test
String temp2 = "11 11 2222 3333 4444"; // inner test
String temp3 = "11111 2222 3333 4444"; // inner test
String temp4 = "1111 2a222 3333 4444"; // inner test

public String chkContainCardno(String inputstr) 

    Pattern p = Pattern.compile("[0-9]4\\s[0-9]4\\s[0-9]4\\s[0-9]4");
    Matcher m = p.matcher(inputstr);

    if (m.find()) 
        return m.group(0);
     else 
        return ErrMsg.Does_Not_Contain_Card_No;
    

[测试结果]

temp1 : adfs 1111 2222 3333 4444 fadad : true 1111 2222 3333 4444

temp2:11 11 2222 3333 4444:假

temp3 : 11111 2222 3333 4444 : true 1111 2222 3333 4444 我不明白

temp4:1111 2a222 3333 4444:假

【问题讨论】:

第 1 和第 3 是唯一匹配模式的输入以查找 4 组 4 位数字 有一个实际的算法来检查信用卡是否是真实的信用卡号,称为Luhn algorithm 【参考方案1】:

第三个测试通过了,因为您的模式周围没有锚点。您应该在任一端添加\b,即"\\b[0-9]4\\s[0-9]4\\s[0-9]4\\s[0-9]4\\b",以强制在单词边界内匹配。

【讨论】:

【参考方案2】:

你可以用这个:

"(\\b\\d4\\s\\d4\\s\\d4\\s\\d4\\b)"

b - 单词边界

d - 数字

【讨论】:

以上是关于信用卡号验证 用c++如何解决?的主要内容,如果未能解决你的问题,请参考以下文章

验证信用卡号(超出格式)

使用正则表达式验证信用卡号

使用 OpenCV 和 Python 识别信用卡号

验证信用卡号

如何使用 jQuery 信用卡验证器

C# Windows 应用程序(不是 wpf)将文本框中的信用卡号屏蔽为输入,然后验证和处理信用卡号