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);

Объяснение кода листинга программы

  1. Программа использует функцию printf для вывода сообщения с просьбой ввести имя покупки.
  2. В качестве формата ввода функции printf используется %d, что означает, что ввод должен быть числовым.
  3. Функция fflush(stdin) используется для очистки буфера ввода. Это необходимо, потому что функция scanf не работает корректно, если в буфере ввода остаются символы от предыдущего ввода.
  4. Функция gets используется для считывания строки, представляющей имя покупки.
  5. Значение переменной p_list[i].name будет присвоено строке, введенной пользователем.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 3.556 из 5
Похожие ответы