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 будет присвоено строке, введенной пользователем.