Функция fflush (stdin) не работает

Я не могу понять, что не так с этим кодом:

#include  #include  #include  #include  #define MAX 100 #define TRUE 1 #define FALSE 0 char sect_cat; char customer_name[MAX]; char customer_number[MAX]; /* error handling is easier */ int prev_unit = 0; int current_unit = 0; int consumed = 0; int set = FALSE; float init_bill; float tax; float total_bill; void get_userinfo() { printf("Enter sector category: "); scanf("%c", &sect_cat); printf("Enter customer name: "); fflush(stdin); scanf("%sn", &customer_name); set = FALSE; while (set == FALSE) { printf("Enter customer number: "); fflush(stdin); scanf("%s", customer_number); int i; int error; for (i=0, error=0; i current_unit) { printf("ERROR: Current unit must be larger than previous unit\n"); } else set = TRUE; } consumed = current_unit - prev_unit; } int main() { /* Introduce program to users */ printf("\nThis program computes your electric bill based on these sector categories\n\n"); printf("\tResidential(R)\n"); printf("\tIndustrial(I)\n"); printf("\tCommercial(C)\n\n"); printf("Press any key to continue..."); fflush(stdin); getchar(); 

#################### редактировать

Применяя решение templatetypedef, программа теперь ждет ввода пользователем имени customer_name. Однако ввод строки с пробелом приводит к ошибке, и программа предполагает, что слово после пробела вводится для следующего запроса.

 Enter sector category: r Enter customer name: George of the Jungle Enter customer number: ERROR: Only numbers are allowed Enter customer number: ERROR: Only numbers are allowed Enter customer number: 

Функция fflush не выводит данные из входного streamа; вместо этого он используется для перемещения данных, буферизованных в выходном streamе, в пункт назначения. Это описано здесь . Как видно из этого ранее вопроса SO , попытка использования fflush(stdin) приводит к неопределенному поведению, поэтому лучше избегать его.

Если вы хотите съесть новую строку из возвращаемого символа, введенного, когда пользователь закончил вводить свой символ, вместо этого рассмотрите следующее:

 scanf("%c\n", &sect_cat); 

Это будет использовать новую строку, а не оставлять ее в stdin .

Надеюсь это поможет!

Я думаю, что вы хотели написать fflush(stdout) вместо fflush(stdin) .

fflush должен работать с streamом вывода, см. здесь документы

  • Чтение из stdin flush stdout?
  • Использование fflush (stdin)
  • Чтение Eclipse stdin (System.in) из файла
  • Как читать из файла или stdin в Bash?
  • Запуск внешней программы с перенаправленным stdin и stdout из Java
  • Обманите приложение, думая, что его выступление - это терминал, а не труба
  • Как читать из stdin по строкам в узле
  • Как заставить ssh получить пароль от stdin
  • Чтение двоичных данных из std :: cin
  • Я не могу сбросить stdin
  • Как прочитать строку, введенную пользователем в C?
  • Interesting Posts

    Инструкции по настройке двух мониторов для Windows 8

    Включить двоичный файл с помощью скрипта GNU ld linker

    java.io.IOException: Не удалось найти исполняемый файл null \ bin \ winutils.exe в двоичных файлах Hadoop. искра Eclipse на windowsх 7

    правильная аннотация для спящего режима для байта

    scanf не будет запрашивать ввод во второй раз

    Как вернуть накопленные результаты нескольких (параллельных) асинхронных вызовов функций в цикле?

    Каким персонажем это (𝒲)

    Как разобрать аргументы командной строки в Java?

    Обратный комплексный 2D-справочный стол

    ошибка C2143: синтаксическая ошибка: отсутствует ‘;’ перед «типом»

    Опираясь на элементы управления внутри панели (C # WinForms)

    Каков самый быстрый способ запуска приложения в Windows 8?

    C ++: Каков размер объекта пустого classа?

    Ошибка жесткого диска? Не удается запустить CHKDSK. Восстановление?

    Динамический и основной диск – жесткие диски

    Давайте будем гением компьютера.