Skip to content

Instantly share code, notes, and snippets.

@0xF5T9
Last active November 28, 2024 14:53
Show Gist options
  • Save 0xF5T9/da7e40e475e41447030456e5c815bcb2 to your computer and use it in GitHub Desktop.
Save 0xF5T9/da7e40e475e41447030456e5c815bcb2 to your computer and use it in GitHub Desktop.
c_check_credit_format
#include <stdio.h>
unsigned long long countDigit(unsigned long long n);
int main(void)
{
unsigned long long cardNumber, digitLength;
char cardNumberText[255], cardType[255];
do
{
printf("Number: ");
scanf("%llu", &cardNumber);
digitLength = countDigit(cardNumber);
sprintf(cardNumberText, "%llu", cardNumber);
if (cardNumberText[0] == '4' && (digitLength == 13 || digitLength == 16))
sprintf(cardType, "%s", "VISA");
else if (cardNumberText[0] == '5' && digitLength == 16)
{
if (cardNumberText[1] == '1' || cardNumberText[1] == '5')
sprintf(cardType, "%s", "MASTERCARD");
else
sprintf(cardType, "%s", "INVALID");
}
else if (cardNumberText[0] == '3')
{
if ((cardNumberText[1] == '4' || cardNumberText[1] == '7') && digitLength == 15)
sprintf(cardType, "%s", "AMEX");
else
sprintf(cardType, "%s", "INVALID");
}
else
sprintf(cardType, "%s", "INVALID");
} while (!cardNumber);
unsigned long long sum = 0;
for (int i = digitLength - 1; i >= 0; i--)
{
int digit = cardNumberText[i] - '0';
if ((digitLength - i) % 2 == 0)
{
digit *= 2;
sum += (digit > 9) ? (digit - 9) : digit;
}
else
sum += digit;
}
char sumStringBuffer[20], sumDigitLength = countDigit(sum);
sprintf(sumStringBuffer, "%llu", sum);
if (sumStringBuffer[sumDigitLength - 1] - '0' != 0)
sprintf(cardType, "%s", "INVALID");
printf("%s\n", cardType);
return 0;
}
unsigned long long countDigit(unsigned long long n)
{
if (n < 0)
return countDigit((n == INT_MIN) ? INT_MAX : -n);
if (n < 10)
return 1;
return 1 + countDigit(n / 10);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment