Как исправить этот цикл do-while, чтобы консольная программа запрашивала пользователя перед автоматическим закрытием? - PullRequest
2 голосов
/ 07 мая 2019

Когда я запускаю этот код, все работает гладко до последней части. После вопроса "Хочешь повторить?" Когда консоль запрашивает ответ, она не запрашивает ответ, а завершает программу.

Как мне отредактировать код для цикла do-while, чтобы у пользователя запрашивался ответ вместо автоматического закрытия программы? Я чувствую, что это проблема спецификаторов формата, я новичок в этом, и у меня были проблемы с этим. Спасибо!

#include <stdio.h>

int main(void)
{
    double num1, num2;
    char operation, repeat = "y";
    printf("This is a calculator.");

    do {
        printf("\nWould you like to multiply(*), divide(/), add(+) or subtract(-) the two numbers you will soon input? \n");
        scanf("%c", &operation);
        printf("Please enter the first number you would like to deal with. \n");
        scanf("%lf", &num1);
        printf("And the second?\n");
        scanf("%lf", &num2);

        switch (operation)
        {
        case '*':
            printf("The product of %1.2lf and %1.2lf is %1.2lf.\n",
                   num1, num2, num1 * num2);
            break;
        case '/':
            printf("The quotient of %1.2lf and %1.2lf is %1.2lf.\n",
                   num1, num2, num1 / num2);
            break;
        case '+':
            printf("The sum of %1.2lf and %1.2lf is %1.2lf.\n",
                   num1, num2, num1 + num2);
            break;
        case '-':
            printf("The difference of %1.2lf and %1.2lf is %1.2lf.\n",
                   num1, num2, num1 - num2);
            break;
        }
        printf("Would you like to repeat?(y/n)\n");
        scanf("%c", &repeat);
    } while (repeat == "y" || repeat == "Y");
}

1 Ответ

2 голосов
/ 07 мая 2019

Остался символ новой строки в stdin от предыдущей операции ввода.Ваш

scanf("%c",&repeat);

читает этот символ новой строки, потому что спецификатор преобразования %c не пропускает пробельные символы.Используйте

scanf(" %c", &repeat);

для пропуска начальных пробелов.


В C и C ++ одиночные символы заключаются в одинарные кавычки.

char ch;
ch == "A";

будет сравнивать значениеch по адресу строкового литерала "A".

Итак ...

while(repeat=="y"||repeat=="Y");

~>

while(repeat == 'y' || repeat == 'Y');

и

char operation, repeat="y";

~>

char operation, repeat = 'y';

Ваш компилятор должен был предупредить вас об этом.Если нет, вы должны увеличить уровень предупреждения вашего компилятора.


Вы также можете проверить деление на ноль, которое не определено.


И последнее: printf() не заботится о спецификаторе длины l в %lf, он такой же, как %f из-за распространения параметров по умолчанию.Аргумент float в вызове функции, которая принимает переменное число аргументов, всегда преобразуется в double перед передачей в функцию.Таким образом, есть только %f для printf().


PS: как Cacahuete Frito сказано в комментариях:

Вы должны проверитьвозвращаемое значение scanf()

Да, вы должны.Никогда не доверяй пользователю.

...