我有这个Luhn的C代码’;s算法。通过测试一些信用卡号码,它运行良好,但是代码检查给了我这些错误。为什么?

我有这个Luhn的C代码’;s算法。通过测试一些信用卡号码,它运行良好,但是代码检查给了我这些错误。为什么?,c,cs50,luhn,C,Cs50,Luhn,我有这个Luhn算法的C代码。通过测试一些信用卡号码,它运行良好,但是代码检查给了我这些错误。为什么? 运行代码时,所有信用卡号都已正确检查,但代码检查说明: 应为“xxxx”,而不是如下所示的“xxxx” 文件名为credittest.c 代码如下 the error check gives these errors below: ~/pset1/credit/ $ check50 cs50/problems/2020/x/credit Connecting..... Authenticat

我有这个Luhn算法的C代码。通过测试一些信用卡号码,它运行良好,但是代码检查给了我这些错误。为什么?

运行代码时,所有信用卡号都已正确检查,但代码检查说明: 应为“xxxx”,而不是如下所示的“xxxx”

文件名为credittest.c

代码如下

the error check gives these errors below:

~/pset1/credit/ $ check50 cs50/problems/2020/x/credit
Connecting.....
Authenticating....
Verifying.....
Preparing.....
Uploading............
Waiting for results...........................
Results for cs50/problems/2020/x/credit generated by check50 v3.1.2
:) credit.c exists
:) credit.c compiles
:( identifies 378282246310005 as AMEX
    expected "AMEX\n", not ""
:( identifies 371449635398431 as AMEX
    expected "AMEX\n", not ""
:( identifies 5555555555554444 as MASTERCARD
    expected "MASTERCARD\n", not ""
:( identifies 5105105105105100 as MASTERCARD
    expected "MASTERCARD\n", not ""
:( identifies 4111111111111111 as VISA
    expected "VISA\n", not ""
:( identifies 4012888888881881 as VISA
    expected "VISA\n", not ""
:( identifies 1234567890 as INVALID
    expected "INVALID\n", not ""
:( identifies 369421438430814 as INVALID
    expected "INVALID\n", not ""
:( identifies 4062901840 as INVALID
    expected "INVALID\n", not ""
:( identifies 5673598276138003 as INVALID
    expected "INVALID\n", not ""
:( identifies 4111111111111113 as INVALID
    expected "INVALID\n", not ""

代码如下:


//prompts the user for a credit card number and then reports (via printf) whether
//it is a validity American Express, MASTERCARD, or Visa card number

//All American Express numbers 15-digit start with 34 or 37;
//most MASTERCARD numbers 16-digit start with 51, 52, 53, 54, or 55
///all Visa numbers 13- and 16-digit start with 4


#include<stdio.h>
#include<cs50.h>
#include<math.h>
bool validity(long cardnumber);
int find_length(long cardnumber);
bool checksum(long cardnumber);
void printcardbrand(long cardnumber);



int main(void)
{
    long cardnumber;

    do
    {
        cardnumber = get_long("What is the card number: ");
    }
    while (cardnumber < 0);



    if (validity(cardnumber))
    {
        printcardbrand(cardnumber);
    }

    else
    {
        printf("INVALID\\n\n");
    }

}



bool validity(long cardnumber)
{
    int len = find_length(cardnumber);

    if((len == 13 || len == 16) && checksum(cardnumber) && ((cardnumber >= 4e12 && cardnumber < 5e12)|| (cardnumber >= 4e15 && cardnumber < 5e15)))
    return true;

    if(len == 16 && checksum(cardnumber) && (cardnumber >= 51e14 && cardnumber < 56e14))
    return true;

    if(len == 15 && checksum(cardnumber) && ( (cardnumber >= 34e13 && cardnumber < 35e13) || (cardnumber >= 37e13 && cardnumber < 38e13) ) )
    return true;

    else
    return false;

}




int find_length(long cardnumber)
{
    int len;

    for (len = 0; cardnumber != 0; cardnumber /= 10)
    {
        len++;
    }
    return len;
}



bool checksum(long cardnumber)
{
    int sum = 0;

    for (int i = 0; cardnumber != 0; i++, cardnumber /=10)
    {
        if (i % 2 == 0)
        {
            sum = sum + cardnumber % 10;  //get remainder, i.e. the even index digit
        }

        else
        {
            int digit = 2 * (cardnumber % 10);
            sum = sum + digit / 10 + digit % 10;
        }
    }

    return (sum % 10) == 0;

}





void printcardbrand(long cardnumber)
{
    if ( (cardnumber >= 34e13 && cardnumber < 35e13) || (cardnumber >= 37e13 && cardnumber < 38e13) )
    {
        printf("AMEX\\n\n");
    }

    else if ( (cardnumber >= 51e14 && cardnumber < 56e14) )
    {
        printf("MASTERCARD\\n\n");
    }

    else if ( (cardnumber >= 4e12 && cardnumber < 5e12) || (cardnumber >= 4e15 && cardnumber < 5e15) )
    {
        printf("VISA\\n\n");
    }


}



// checksum, card length, starting digits will decide which card it is.

//last line of output be AMEX\n or MASTERCARD\n or VISA\n or INVALID\n


``

//提示用户输入信用卡号,然后(通过printf)报告是否
//它是有效的美国运通卡、万事达卡或Visa卡卡号
//所有美国运通的15位数字都以34或37开头;
//大多数万事达卡16位数字以51、52、53、54或55开头
///所有13位和16位的签证号码均以4开头
#包括
#包括
#包括
bool有效期(长卡号);
int find_长度(长卡号);
布尔校验和(长卡号);
无效打印卡片品牌(长卡号);
内部主(空)
{
长卡号;
做
{
cardnumber=get_long(“卡号是多少?”);
}
而(卡号<0);
if(有效期(卡号))
{
打印卡片品牌(卡片编号);
}
其他的
{
printf(“无效\\n\n”);
}
}
bool有效期(长卡号)
{
int len=查找长度(卡号);
if((len==13 | | len==16)和校验和(cardname)&((cardname>=4e12和&cardname<5e12)|(cardname>=4e15和&cardname<5e15)))
返回true;
if(len==16&&checksum(cardname)&&(cardname>=51e14&&cardname<56e14))
返回true;
如果(len==15&&checksum(cardname)&&((cardname>=34e13&&cardname<35e13)| |(cardname>=37e13&&cardname<38e13)))
返回true;
其他的
返回false;
}
整数查找长度(长卡号)
{
内伦;
对于(len=0;cardnumber!=0;cardnumber/=10)
{
len++;
}
回程透镜;
}
布尔校验和(长卡号)
{
整数和=0;
对于(int i=0;cardnumber!=0;i++,cardnumber/=10)
{
如果(i%2==0)
{
sum=sum+cardnumber%10;//获取余数,即偶数索引位
}
其他的
{
整数位数=2*(卡号%10);
总和=总和+位数/10+位数%10;
}
}
返回(总和%10)==0;
}
作废打印卡品牌(长卡号)
{
如果((卡号>=34e13&卡号<35e13)| |(卡号>=37e13&卡号<38e13))
{
printf(“美国运通\\n\n”);
}
否则如果((卡号>=51e14&&卡号<56e14))
{
printf(“万事达卡\\n\n”);
}
否则如果((卡号>=4e12&卡号<5e12)| |(卡号>=4e15&卡号<5e15))
{
printf(“VISA\\n\n”);
}
}
//校验和、卡片长度、起始数字将决定它是哪张卡片。
//输出的最后一行是美国运通\n或万事达卡\n或VISA \n或无效\n
``

您的printf调用说
“美国运通\\n\n”
,而它应该是
“美国运通\n”

check50的措辞并不好,从技术上讲,你按照他们的字面意思做了,但这不是他们的意思。Check50显示预期的
“美国运通\n”
,但终端中的输出应为
美国运通
,全部在一行上。为此,您需要使用以下代码

printf("AMEX\n")

显然,其他所有信用卡的情况都是一样的,你的printf电话说的是“美国运通\\n\n”,而实际上应该是“美国运通”

check50的措辞并不好,从技术上讲,你按照他们的字面意思做了,但这不是他们的意思。Check50显示预期的
“美国运通\n”
,但终端中的输出应为
美国运通
,全部在一行上。为此,您需要使用以下代码

printf("AMEX\n")

显然,其他所有信用卡都是一样的

使用了什么编译器?您的
long
类型中有多少位?在我的系统中,长字符只能容纳10位数字(2147483647,甚至不能容纳10位9)。大多数信用卡号都比这个长。每个
printf
格式字符串都应该以
\n
而不是
\\n\n
结尾。测试软件没有得到任何输出。printf是如何发布结果的?如果您发布了其他人可以编译的内容,可能会有所帮助。不是每个人都有
cs50.h
。我将
long
更改为
int64\t
,并修复了
printf
语句,这是有效的:正如@jwdonahue所提到的,
long
可能不是64位。谢谢,它要求在结尾处用\n和一个新行打印出来,这就是为什么\\n\n在那里。使用了什么编译器?您的
long
类型中有多少位?在我的系统中,长字符只能容纳10位数字(2147483647,甚至不能容纳10位9)。大多数信用卡号都比这个长。每个
printf
格式字符串都应该以
\n
而不是
\\n\n
结尾。测试软件没有得到任何输出。printf是如何发布结果的?如果您发布了其他人可以编译的内容,可能会有所帮助。不是每个人都有
cs50.h
。我将
long
更改为
int64\t
,并修复了
printf
语句,这是有效的:正如@jwdonahue所提到的,
long
可能不是64位。谢谢,它要求在结尾处用\n和一个新行打印出来,这就是为什么\\n\n在那里。是的,谢谢。文件名为credittest.c。代码检查只会检查credit.c文件;这就是为什么会出现错误,因为信用中没有任何东西;一旦我把这个文件保存为credit.c,一切都很好。是的,谢谢。文件名为credittest.c。代码检查只会检查credit.c文件;这就是为什么会出现错误,因为信用中没有任何东西;一旦我把这个文件保存为credit.c,一切都很好。