Подтвердить что ты не робот

Что такое использование fflush (stdin) в c-программировании

У меня есть следующая программа

#include <stdio.h>
#include <stdlib.h>

int main()
{
   char ans[8];
    int i;
    for(i=1;i<=3;i++)
    {
        printf("\n What is the unit of traffic ?");
        scanf("%s",ans);
        fflush(stdin);

        if(stricmp(ans,"Earlang")==0)
        {
            printf("\nAnswer is correct");
            exit(1);
        }
        else
            if(i<3)
            printf("\n Try Again!\n");
    }
    printf("\n Nunit of traffic is Earlang:");
}

Каково использование fflush (stdin) в этой программе?

4b9b3361

Ответ 1

Это не в стандарте C, поэтому поведение undefined.

Некоторая реализация использует его для очистки буфера stdin.

Из C11 7.21.5.2 Функция fflush, fflush работает только с потоком вывода/обновления, а не с потоком ввода.

Если поток указывает на выходной поток или поток обновления, в котором последние операция не была введена, функция fflush вызывает любые неписанные данные для этого потока для доставки в среду хоста, которая должна быть записана в файл; в противном случае поведение undefined.

Ответ 2

он очищает буфер stdin перед чтением. От человека страница:

Для выходных потоков функция fflush() заставляет записывать все буферизированное пользователем пространство данные для данного потока данных или потока обновления через поток, лежащий в основе написать функцию. Для входных потоков fflush() отбрасывает любые буферизованные данные который был извлечен из основного файла, но не был потребляемых приложением.

Примечание. Это зависит от Linux, при использовании fflush() для входных потоков стандарт undefined по стандарту, однако большинство реализаций ведут себя так же, как в Linux.

Ответ 3

Это несвязанный способ удалить все данные из входного буфера до следующей новой строки. Я видел, как он использовался в таких случаях:

char c;
char s[32];
puts("Type a char");
c=getchar();
fflush(stdin);
puts("Type a string");
fgets(s,32,stdin);

Без fflush(), если вы введете символ, скажите "a" и нажмите enter, входной буфер содержит "a\n", getchar() заглянет "a", но "\n" остается в буфере, поэтому следующий fgets() найдет его и вернет пустую строку, даже не дожидаясь ввода пользователя.

Однако обратите внимание, что это использование fflush() не переносимо. Я тестировал прямо сейчас на машине Linux, и это не работает, например.