I have this C code for Luhn’s Algorithm. it is running fine by testing some credit card numbers, but the code checking gives me these errors. Why?
when running the code, all credit card numbers are checked correctly, but the code checking say this : expected "xxxx", not "" as shown below.
The file name is credittest.c
The code is below.
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 ""
below is the code:
//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
``