user2304236
user2304236

Reputation: 25

Factorial issue with user input

I am learning c language and i am confused about the code below. its a recursion but how come when i run this code, it won't run until i provided 2 different inputs but system only execute the first?

Thanks in advance.

#include <stdio.h>

long factor (float user_input)
{
if(user_input <=1)
return 1;
else
return (user_input * factor (user_input - 1));
}

int main ()
{
int user_input;
long factorial_calculation;
printf("what factorial number would you like to calculate?\n");
scanf("%d\n", &user_calculation);
factorial_calculation = factor (user_input);
printf("ld\n", factorial_calculation);
return 0;
}

Upvotes: 1

Views: 75

Answers (2)

brokenfoot
brokenfoot

Reputation: 11649

  1. Your user_input is int but you are passing variable as a float and running your factorial function on it. Factorials are undefined for non-integer nos, so you are better off using int.

  2. In:

    printf("ld\n", factorial_calculation);
    

    ld is an invalid format specifer.

  3. In

    scanf("%d\n", &user_calculation);
    

    I think you meant

    scanf("%d", &user_input);
    

The following code works:

#include <stdio.h>

int factor (int user_input)
{
    if(user_input <=1)
        return 1;
    else
        return (user_input * factor (user_input - 1));
}

int main ()
{
    int user_input;
    long factorial_calculation;
    printf("what factorial number would you like to calculate?\n");
    scanf("%d", &user_input);
    printf("%d\n",user_input);
    factorial_calculation = factor (user_input);
    printf("%d\n", factorial_calculation);
    return 0;
}

Upvotes: 4

wallyk
wallyk

Reputation: 57784

scanf() is notoriously difficult to synchronize with user input. Instead, use fgets() and inspect the string for a number (or numbers if more than one is expected per line).

long factorial_calculation;
char buf [1000];
for (;;)
{
    printf("What factorial number would you like to calculate?\n");
    if (!fgets (buf, sizeof buf, stdin))  /* probably EOF, hangup, etc.:  just exit */
        return 0;
    if (1 != sscanf(buf, "%ld", &user_calculation))
    {
        printf ("No number entered, please try again\n");
        continue;
    }
    factorial_calculation = factor (user_input);
}

Upvotes: 2

Related Questions