Я сделал несколько исправлений в вашей программе.
- Было трудно понять, что делает ваша программа.Я сделал вашу программу более читабельной и модульной, определив отдельную функцию многократного использования для
factorial
. - Имеет смысл еще раз запросить у пользователя номер, если пользователь ввел
'y'
.Итак, я переместил требуемый код. - Я не рекомендую смешивать использование
scanf
и getchar
в программе.Итак, мы можем просто использовать scanf
для программы.Функция scanf()
автоматически удаляет пробелы, прежде чем пытаться анализировать преобразования, отличные от символов.Форматы символов (в основном% c; также наборы сканирования% […] - и% n) являются исключением;они не удаляют пробелы.
Используйте "% c" с leading blank
, чтобы пропустить необязательный пробел.Не используйте конечный пробел в строке формата scanf ().
Обратите внимание, что он по-прежнему не использует конечные пробелы, оставшиеся во входном потоке, даже до конца строки, поэтому остерегайтесь этогоесли также использовать getchar () или fgets () в том же потоке ввода.Мы просто заставляем scanf пропускать пробелы перед преобразованиями, как это делается для% d и других преобразований, не связанных с символами.
#include <stdio.h>
unsigned long factorial(unsigned long num)
{
unsigned long mult = 1;
unsigned long k = 1;
while (k <= num) {
mult *= k;
k++;
}
return mult;
}
int main(void)
{
char answer = 'y';
do {
int num = 0;
printf("Enter a number: \n");
scanf(" %d", &num);
unsigned long mult = factorial(num);
printf("%d! = %lu\n", num, mult);
printf("Would you like to try another number? \n");
printf("Enter: y for yes | n for no\n");
scanf(" %c", &answer);
} while (answer != 'n');
return 0;
}