В функции display
вы используете char
вместо int
, так как вы используете спецификатор формата %d
в scanf
, измените его на int
везде.Вы, должно быть, видели предупреждение при компиляции:
warning: format ‘%d’ expects argument of type ‘int *’, but argument 2 has type ‘char *’
Кроме этого, ваша программа не может доставить, когда введено число 10 , для ее решения:
while(next>=0) //WHEN NEGATIVE NUMBER IS ENTERED IT WILL END THE LOOP
{
num = next;
fact_fun(num);
next=display();
}
Упростите fact_fun:
void fact_fun(int num_fact)
{
int fact =1;
if(num_fact == 0)
{
printf("Factorial of %d is 1",num_fact);
return;
}
else
{
for(int i = 1; i<= num_fact; i++)
{
fact = fact*i;
}
printf("Factorial of %d is %d",num_fact,fact);
}
}
Тогда все будет работать нормально.
ПРИЧИНА ЗА СБОЙ ПРОГРАММЫ, КОГДА ВХОД 10: ASCII
значение новой строки \n
также равно 10 , поэтому при вводе десяти значение int
\n
сравнивается со значением, возвращаемым display
, т. Е. 10 , следовательно, цикл while никогда не выполняется в этом случае.
Вот как должен быть безопасен метод ввода данных (scanf
- это катастрофа):
int display()
{
char inp[10]={0};
int input;
int index=0;
printf("Enter number to find factorial or press ENTER to exit : ");
while(((input=getchar())!=EOF)&(index<10))
{
if((input>='0')&&(input<='9'))
{
inp[index++]=input;
}
else if(input=='\n')
break;
else
return -1;
}
input=atoi(inp);
return input;
}