C - цикл не продолжается - PullRequest
0 голосов
/ 21 ноября 2018

Почему этот цикл не продолжается после ввода буквы y в ответ char?

Я думал, что getchar() поможет, но похоже, что он ничего не делает.

#include <stdio.h>

int main(void)
{
    char answer = 'y';
    int num = 0;
    printf("Enter a number: \n");
    scanf("%d", &num);

    while(answer != 'n')
    {
        int mult = 1;
        int k = 1;
        while (k <= num)
        {
            mult *= k;
            k++;
        }
        printf("%d! = %d\n", num, mult);

        printf("Would you like to try another number? \n");
        printf("Enter: y for yes | n for no\n");
        getchar();
        scanf("%c", &answer);
    }       
}

Ответы [ 3 ]

0 голосов
/ 21 ноября 2018

Я сделал несколько исправлений в вашей программе.

  1. Было трудно понять, что делает ваша программа.Я сделал вашу программу более читабельной и модульной, определив отдельную функцию многократного использования для factorial.
  2. Имеет смысл еще раз запросить у пользователя номер, если пользователь ввел 'y'.Итак, я переместил требуемый код.
  3. Я не рекомендую смешивать использование 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;   
}   
0 голосов
/ 21 ноября 2018

Ваш код работает, и цикл продолжается: он не запрашивает номер повторно, потому что эта часть находится вне цикла.Переместите это внутрь.Также обратите внимание, что ваш код продолжает выполняться даже при нажатии любой другой клавиши, а не n.

Это один из способов сделать это, начиная с вашего кода:

    #include <stdio.h>

    int main(void)
    {
            char answer = 'y';
            int num = 0;

            while(answer != 'n')
            {
                    printf("Enter a number: \n");
                    scanf("%d", &num);
                    int mult = 1;
                    int k = 1;
                    while (k <= num)
                    {
                            mult *= k;
                            k++;
                    }
                    printf("%d! = %d\n", num, mult);

                    printf("Would you like to try another number? \n");
                    printf("Enter: any key for  yes | n for no\n");
                    getchar();
                    scanf("%c", &answer);
            }
    }
0 голосов
/ 21 ноября 2018
    getchar(); // takes the user input but assigns it nowhere
    scanf("%c", &answer); // reads newline, aborts while loop

Используйте c = getchar(); и пропустите scanf.

Также обратите внимание, что более идиоматический способ сделать это - использовать цикл do-while.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...