Как очистить буфер перед сканированием

Я пишу код программы, которая считывает ввод от пользователя и в зависимости от этого вычисляет (площадь, окружность, объем или выход)

#include<stdio.h>

int main(void)
{
    double radius=0.0;
    double area=0.0;
    double volume=0.0;
    double height=0.0;
    double circumference=0.0;
    const double pi=13.459820934;

    char choice;

    do
    {
    printf("Choose what you want to do : \n"
           "Calculate Area          A\n"
           "Calculate Circumference C\n"
           "Calculate Volume        V\n"
           "Quit                    Q\n");
    /*scanf("%c",&choice);*/
    choice=getchar();

    printf("please enter radius : ");
    scanf("%lf",&radius);

    if(choice=='V')
    {
        printf("please enter height : ");
        scanf("%lf",&height);
    }

    area = pi * radius * radius;
    volume = height * area;
    circumference = 2 * pi * radius;

    switch (choice)
    {
    case 'A':
        printf("Area = %lf\n\n",area);
        break;
    case 'V':
        printf("Volume = %lf\n\n",volume);
        break;
    case 'C':
        printf("Circumference = %lf\n\n",circumference);
        break;
    default:
        printf("Not a good answer !!\n\n");
    }
    }while(choice!='Q');

return 0;
}

когда я запускал программу, она работала хорошо для первого цикла do, но после повторного выбора вариантов, поскольку она запускает цикл во второй раз, она не ждала, пока я введу свой выбор, она прямо напечатала «пожалуйста, введите радиус»

когда я отлаживал программу, я обнаружил, что при запуске цикла во второй раз было выбрано «\ n», как я могу удалить этот «\ n» каждый цикл? Я знал, что это '\n' возникло в результате чтения выбора пользователя, за которым последовал первый запуск цикла, но я не знаю, почему выбор удален из выбора, а не был?

Я пытался инициализировать выбор, прежде чем отображать выбор пользователю, но возникла та же проблема.

любая помощь, пожалуйста? заранее спасибо


person Salahuddin    schedule 10.01.2014    source источник
comment
возможный дубликат Как очистить входной буфер в C?   -  person Lee Duhem    schedule 10.01.2014


Ответы (1)


Символ \n остается после вызова scanf после нажатия клавиши Enter . Вам нужно использовать этот \n перед следующей итерацией, иначе этот \n символ будет прочитан к следующему scanf или getchar.

Используйте фрагмент

int ch;
while((ch = getchar()) != EOF || ch != '\n');

непосредственно перед закрывающей фигурной скобкой } числа do-while или после второго scanf.

person haccks    schedule 10.01.2014
comment
Можете ли вы сказать мне, что он делает? - person Salahuddin; 10.01.2014
comment
@Салахуддин; Обновил ответ. - person haccks; 10.01.2014
comment
в то время как (getchar ()! = '\ n'); Я использовал этот фрагмент, и он сработал. Таким образом, любой ввод, вводимый пользователем, сопровождается «\ n», поэтому сам ввод считывается из буфера и помещается в переменную (ее выбор), но «\ n» остается позади в буфер, поэтому мы должны притвориться, что мы снова читаем ввод, чтобы прочитать это '\n' и очистить буфер, и это функция while(getchar()!='\n'); если я прав, почему '\n' не был прочитан с самим вводом и не помещен в переменную? почему это осталось позади - person Salahuddin; 10.01.2014
comment
Да, ты прав. \n не читается scanf, потому что %lf ожидает аргумент типа double. Он может пропускать любое количество пробелов (табуляция, пробел, новая строка и т. д.). - person haccks; 10.01.2014
comment
так что пока (getchar ()! = '\ n'); просто используется для удаления пробелов и '\n'? - person Salahuddin; 10.01.2014
comment
так почему мы используем его в этом фрагменте? do { printf (пожалуйста, укажите радиус); в то время как(getchar() != '\n'); } while(scanf(%Lf, &radius) != 1); этот фрагмент используется, чтобы убедиться, что пользователь ввел реальное число. Как вы сказали, while(getchar()!='\n') используется для очистки пробелов и '\n', так как же может быть пробел в этот фрагмент извините за плохое форматирование, не знаю, как форматировать код в комментарии - person Salahuddin; 10.01.2014
comment
scanf("%lf",&radius); считывает только введенный пользователем радиус. Он не читает \n. Этот \n читается следующим scanf или getchar. Прочитайте мой ответ еще раз. - person haccks; 10.01.2014
comment
давайте продолжим это обсуждение в чате - person Salahuddin; 10.01.2014