Why does my code get stuck on a valid input?

Viewed 80

Whenever I run this code with a valid input, it's not outputting correctly and never ends on its own. I'm not sure how to debug this. (4003600000000014) it just takes the input then stops without leaving the script? Any help on this would be appreciated

#include <cs50.h>
#include <stdio.h>

int main(void)
{
    //credit card number
    long n;

    //decimel holder
    int d = 0;

    int j = 1;

    //math opperation variables

    int odd = 0;
    int even = 0;
    long n_mod = 0;
    long n_mod_2 = 0;
    long n_mod_3 = 0;
    int valid = 0;
    int e_1 = 0;
    int e_2 = 0;

    //user input

    //dummy proofing
    n = get_long("Credit Card #: ");
    if (n > 0)
    {
        n_mod = n;
        while(n_mod > 0)
        {
            //determining digits
            n_mod /= 10;
            d++;
        }
    }
    //printf("%d\n", d);

    //determines what digits are determines if valid or not
    if (d != 13 && d != 15 && d != 16)
    {
        printf("Invalid Card Number\n");
        return 0;
    }

    //check sum
    do
    {
        //odd digits
        odd = n % 10;
        n_mod_2 = n / 10;
        valid += odd;

        //even digits
        even = n_mod % 10;
        n_mod_2 /= 10;
        e_1 = even % 10;
        e_2 = even / 10;
        valid = valid + e_1 + e_2;
    } while (n_mod_2 > 0);

    //check if valid
    if (valid % 10 > 0)
    {
        printf("Invalid Card Number\n");
        return 0;
    }

    //determine card type
    //pull first 2 digits
    n_mod_3 = n;
    do
    {
        n_mod_3 /= 10;
    } while (n_mod_3 > 100);

    if (n_mod_3 / 10 == 4)
    {
        printf("Card is a valid Visa\n");
    }
    else if ((n_mod_3 / 10 == 3) && (n_mod_3 % 10 == 4 || n_mod_3 % 10 == 7))
    {
        printf("Card is a valid Amex\n");
    }
    else if ((n_mod_3 / 10 == 5) && (n_mod_3 % 10 > 0 || n_mod_3 % 10 < 6))
    {
        printf("Card is a valid Mastercard\n");
    }
    else
    {
        printf("Invalid Card Number\n");
    }

    return 0;
}
1 Answers

This loop doesn't terminate because the variable n_mod_2 is reset to the same value (4003600000000014 / 10) on every loop iteration with input provided:

do {
    //odd digits
    odd = n % 10;
    n_mod_2 = n / 10;
    valid += odd;

    //even digits
    even = n_mod % 10;
    n_mod_2 /= 10;
    e_1 = even % 10;
    e_2 = even / 10;
    valid = valid + e_1 + e_2;
} while(n_mod_2 > 0);
Related