Scanf не ожидает ввода - C (СИ)
Формулировка задачи:
Привет всем, я в первый раз на этом форуме. Вопрос следующий: в программе учета бюджета глючит функция EnterPurchaseList ().
почему то при ее вызове первый gets (p_list[i]); начисто игнорируется. И сразу выполняется следующий printf. В чем может быть ошибка?
#include <stdio.h> #include <conio.h> #include <windows.h> #include <locale> //Для вывода на консоль русских букв setlocale(LC_ALL,"Russian"); #define MAX_NAME_SIZE 40 #define MAX_TYPE_SIZE 30 #define DATE_SIZE 11 struct Purchase { char name[MAX_NAME_SIZE]; char type[MAX_TYPE_SIZE]; float price; float number; }; void EnterPurchase (Purchase p, FILE *f) { fputs (p.name, f); fprintf (f, "\n"); fputs (p.type, f); fprintf (f, "\n"); fprintf (f, "%.2f\n%0.2f\n\n", p.price, p.number); } void PrintPurchase (Purchase p) { printf ("%s\n", p.name); printf ("%s\n", p.type); printf ("%.2f\n", p.price); printf ("%.2f\n\n", p.number); } void ReadPurchase (Purchase *p, FILE *f) { fscanf (f, "%s", &p->name); fscanf (f, "%s", &p->type); fscanf (f, "%f", &p->price); fscanf (f, "%f", &p->number); } void ChangeConsoleLanguage () { setlocale(LC_ALL,"Russian"); //установка основного языка консоли на русский setlocale(LC_NUMERIC, "English"); //установка режима ввода цифр на английский //во избежании проблем со считывание 10-х дробей (',' '.') } void EnterDate (char str[]) { while (true) { printf ("Введите дату покупки в формате dd-mm-yyyy и нажмите Enter\n\n"); gets (str); int counter = 0; if (str[10] != '\0') counter = 1; if (str[0] > 51) counter = 1; if (str[2] != 45) counter = 1; if (str[3] > 49) counter = 1; if (str[3] == 49 && str[4] > 50) counter =1; if (str[5] != 45) counter = 1; if (counter == 1) printf ("Ошибка! Вы ввели дату в неправильном формате. Попробуйте еще раз\n"); else break; } } //------------------------------------------------------------------------------ void EnterPurchaseList () { ChangeConsoleLanguage (); int number; char filename[DATE_SIZE]; printf ("Здесь вы можете ввести список покупок.\n"); printf ("Если вы хотите выйти в предыдущее меню нажмите 'Y'\n\n"); EnterDate (filename); FILE *f = fopen (filename, "w"); printf ("Введите количество покупок\n"); scanf ("%d", &number); Purchase p_list[number]; int i = 1; while (i <= number) { printf ("Введите имя покупки %d\n", i); gets (p_list[i].name); printf ("Введите тип покупки %d\n", i); gets (p_list[i].type); printf ("Введите цену покупки %d\n", i); scanf ("%f", &p_list[i].price); printf ("Введите цену (или массу) покупки %d\n", i+1); scanf ("%f", &p_list[i].number); EnterPurchase (p_list[i], f); i++; } fclose (f); }
Решение задачи: «Scanf не ожидает ввода»
textual
Листинг программы
printf ("Введите имя покупки %d\n", i); fflush(stdin); gets (p_list[i].name);
Объяснение кода листинга программы
- Программа использует функцию printf для вывода сообщения с просьбой ввести имя покупки.
- В качестве формата ввода функции printf используется
%d
, что означает, что ввод должен быть числовым. - Функция fflush(stdin) используется для очистки буфера ввода. Это необходимо, потому что функция scanf не работает корректно, если в буфере ввода остаются символы от предыдущего ввода.
- Функция gets используется для считывания строки, представляющей имя покупки.
- Значение переменной p_list[i].name будет присвоено строке, введенной пользователем.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д