信用卡检查验证C++
C中的问题++ 信用卡号检查,信用卡号的最后一个数字是检查数字,它可以防止抄写错误,如单个数字的错误或两个数字的转换。以下方法用于验证实际信用卡号,但为简单起见,我们将针对8位数字而非16位数字进行说明: •从最右边的数字开始,形成每个其他数字的总和。例如,如果信用卡号为43589795,则您形成的总和为:5+7+8+3=23 •将前一步骤中未包含的每个数字加倍。将结果数字的所有数字相加。例如,对于上面给出的数字,将数字加倍,从倒数第二个数字开始,得到:18 10 8。将这些值中的所有数字相加得到:1+8+1+8+1+0+8=27 •将前面两个步骤的总和相加。如果结果的最后一位为0,则该数字有效。在我们的例子中,23+27=50,所以这个数字是有效的 编写一个实现此算法的程序,并打印数字是否有效 这就是我目前所拥有的信用卡检查验证C++,c++,C++,C中的问题++ 信用卡号检查,信用卡号的最后一个数字是检查数字,它可以防止抄写错误,如单个数字的错误或两个数字的转换。以下方法用于验证实际信用卡号,但为简单起见,我们将针对8位数字而非16位数字进行说明: •从最右边的数字开始,形成每个其他数字的总和。例如,如果信用卡号为43589795,则您形成的总和为:5+7+8+3=23 •将前一步骤中未包含的每个数字加倍。将结果数字的所有数字相加。例如,对于上面给出的数字,将数字加倍,从倒数第二个数字开始,得到:18 10 8。将这些值中的所有数字相加得
我的方法正确吗?我如何前进,因为我在循环中得到了一个核心转储错误,包括从1到8的迭代。所以,当你的代码到达
if (i%2 == 0)
{
sum_even = number.substr(i, 1);
}
它将尝试从字符串边界外创建子字符串,
在担心校验位之前,您需要通过调试程序运行代码。你缺少一些基本概念,下面是我注意到的一些事情。
在表面上,你的j值永远不会增加。对for循环、变量作用域和递增进行一些研究
您正在尝试遍历字符串oddnum而不使用oddnum的长度,并移动到字符串所拥有的内存之前。对字符串操作做一些研究
字符串和C++中的所有其他数组都是零基的,从1开始计数,总是丢失字符串中的第一个元素。阵列接入技术研究
您需要记住,您正在将数字存储在字符串中。这意味着你必须在字符串中取每个元素,并将字符的值转换成C++中的一个数值研究。
可能还有一些事情需要清理。但是,通过在调试器中设置几个断点,您将能够很好地捕获错误 试试这段代码,它的工作原理与您想要的完全相同
//Credit card no validation
#include<iostream>
#include<cstring>
#include<stdlib.h>
#include<conio.h> //for getche()
using namespace std;
int main()
{
int no1=0,od=0,to=0,fi=0;
int j=(-1),ev=0,odd=0;
int i=1;
int max=15;
int x[max];
char ch='a';
string cardno;
cout<<"Enter the 8 digit card no";
do
{
ch=getche();
x[i] = ch-48; //-48 because of ASCII valuse
++i;
++j;
}while(ch != '\r');
if(j!=8)
{
cout<<"\nCredit card is INVALID";
exit(0);
}
cout<<endl;
for(int j=1;j<5;j++)
ev+=x[2*j];
for(int j=0;j<4;j++)
{
od=2*x[(2*j)+1];
no1=od%10+od/10;
odd+=no1;
}
cout<<"Total no of DIGITS in CARD is:"<<j<<endl;
cout<<"Sum of odd digit is "<<ev<<endl;
cout<<"Sum of even digit is "<<odd<<endl;
to=ev+odd;
fi=to%10;
if(fi==0)
{
cout<<"CREDIT CARD IS VALID";
}
if(fi!=0)
{
cout<<"Credit card is INVALID";
}
return 0;
它应该是有用的,我想试试这个它会有用的 但是这个程序是用java语言编写的,所以请理解解决这个问题的方法,并在解决方案中使用它
import java.util.Scanner;
public class Creditcard {
public static void main(String[] args) {
int sum = 0;
int sum1 = 0;
System.out.println("Enter 8 digit credit card number :");
Scanner kb = new Scanner(System.in);
String string = kb.nextLine();
for (int i = 0; i < 8; i++) {
if (i % 2 != 0) {
char ch = (string.charAt(i));
int no = ch - 48;
sum = sum + no;
}
if (i % 2 == 0) {
char ch1 = (string.charAt(i));
int no1 = ch1 - 48;
no1 = (2 * no1);
while (no1 != 0) {
int temp1 = no1 % 10;
no1 = no1 / 10;
sum1 = sum1 + temp1;
}
}
}
int result = sum + sum1;
if (result % 10 == 0) {
System.out.println("valid");
} else {
System.out.println("Invalid");
}
}
}
您的问题与信用卡号码无关,而是内存处理问题。看看标题,还有你的示例代码,在那灯光下。。。您是否应该以不同的方式询问/准备此问题?如果您遇到了分段错误,那么您会崩溃,因为您做了不应该做的坏事。您需要学习如何使用调试器,然后可以在调试器中运行程序,并捕获实际发生的崩溃并查看它发生的位置。您还可以查看并遍历函数调用堆栈,这样,如果调试器尚未停止,您可以转到代码,然后检查变量的值,所有这些都可以帮助您定位并理解崩溃发生的原因。至少请告诉我们在代码中发生了什么碰撞。字符串中的字符索引是C++中的零,就像其他所有的一样。int i=1的最大值;不过,你应该注意的一件事是,C++中的字符串索引从零开始,直到大小减去一个。此外,当从第一个字符以外的任何字符开始时,如何从8个字符的字符串中获取8个字符的子字符串?最后,如果读取字符串,则该字符串中包含字符而不是数字。字符具有不同的编码,但对于最常见的编码,字符“1”的值不是1而是49。
import java.util.Scanner;
public class Creditcard {
public static void main(String[] args) {
int sum = 0;
int sum1 = 0;
System.out.println("Enter 8 digit credit card number :");
Scanner kb = new Scanner(System.in);
String string = kb.nextLine();
for (int i = 0; i < 8; i++) {
if (i % 2 != 0) {
char ch = (string.charAt(i));
int no = ch - 48;
sum = sum + no;
}
if (i % 2 == 0) {
char ch1 = (string.charAt(i));
int no1 = ch1 - 48;
no1 = (2 * no1);
while (no1 != 0) {
int temp1 = no1 % 10;
no1 = no1 / 10;
sum1 = sum1 + temp1;
}
}
}
int result = sum + sum1;
if (result % 10 == 0) {
System.out.println("valid");
} else {
System.out.println("Invalid");
}
}
}