С Новым годом! Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/21: Рейтинг темы: голосов - 21, средняя оценка - 4.76
0 / 0 / 0
Регистрация: 04.08.2012
Сообщений: 5
1

scanf не ожидает ввода

05.08.2012, 21:19. Показов 4011. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Привет всем, я в первый раз на этом форуме. Вопрос следующий: в программе учета бюджета глючит функция EnterPurchaseList ().

почему то при ее вызове первый gets (p_list[i]); начисто игнорируется. И сразу выполняется следующий printf. В чем может быть ошибка?


C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#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);
}
0
Programming
Эксперт
9485 / 562 / 19
Регистрация: 12.04.2006
Сообщений: 11,671
Блог
05.08.2012, 21:19
Ответы с готовыми решениями:

Ошибка ввода scanf
не воспринимает целое в переменной n scanf(&quot;Число N = %d&quot;,n);...

Функция ввода с клавиатуры scanf
Здравствуйте. WinXP, MS VS20005 В приведенном коде BBB независимо от введенного с клавиатуры...

Запрет ввода определённых символов в scanf
всем привет, я тут впервые так что не пинайте за может глупые на ваш взгляд вопросы. я только...

Scanf. Консоль после ввода символа закрывается
Простенький код c scanf, непонятно почему консоль после ввода символа закрывается. Среда Visua...

16
Заблокирован
05.08.2012, 21:30 2
C
1
int i = 1;
нулевой элемент пропускаем?
0
0 / 0 / 0
Регистрация: 04.08.2012
Сообщений: 5
05.08.2012, 21:32  [ТС] 3
Цитата Сообщение от MansMI Посмотреть сообщение
C
1
int i = 1;
нулевой элемент пропускаем?
спасибо за исправление, но ошибка не из-за этого.
0
Заблокирован
05.08.2012, 21:41 4
сразу после:
"Введите имя покупки 1"
идет:
"Введите тип покупки 1" ?
0
0 / 0 / 0
Регистрация: 04.08.2012
Сообщений: 5
05.08.2012, 21:41  [ТС] 5
Цитата Сообщение от MansMI Посмотреть сообщение
сразу после:
"Введите имя покупки 1"
идет:
"Введите тип покупки 1" ?
Именно
0
Заблокирован
05.08.2012, 21:54 6
... где то не прочитали Enter?
0
0 / 0 / 0
Регистрация: 04.08.2012
Сообщений: 5
05.08.2012, 21:58  [ТС] 7
Цитата Сообщение от MansMI Посмотреть сообщение
... где то не прочитали Enter?
Эмм... Не понял. В смысле?

Добавлено через 2 минуты
После нажатия Enter, для того чтобы вбить количество, сразу выскакивают два printf-а. Пробовал задержки ставить, но дело не в этом, тк не помогло.
0
Заблокирован
05.08.2012, 22:07 8
ну бубен он крепкий, всё стерпит, а на второй итерации всё нормально?
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
05.08.2012, 22:14 9
попробуй заменить

C++
1
2
printf ("Введите количество покупок\n");
scanf ("%d", &number);
на
C++
1
number = 5;
и все заработает.
0
2 / 2 / 0
Регистрация: 09.07.2012
Сообщений: 14
05.08.2012, 22:16 10
korviness, попробуй добавить fflush(stdin) 4 раза(после каждого "введите")
т.е.
C++
1
2
3
printf ("Введите имя покупки %d\n", i);
fflush(stdin);
gets   (p_list[i].name);
2
0 / 0 / 0
Регистрация: 04.08.2012
Сообщений: 5
05.08.2012, 22:26  [ТС] 11
Цитата Сообщение от prettynetty Посмотреть сообщение
korviness, попробуй добавить fflush(stdin) 4 раза(после каждого "введите")
т.е.
C++
1
2
3
printf ("Введите имя покупки %d\n", i);
fflush(stdin);
gets   (p_list[i].name);
Спасибо большое! Все заработало.
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
06.08.2012, 09:20 12
Цитата Сообщение от prettynetty Посмотреть сообщение
попробуй добавить fflush(stdin) 4 раза(после каждого "введите")
http://c-faq.com/stdio/stdinflush.html
0
fasked
06.08.2012, 09:22
  #13

Не по теме:

Nameless One, надоело самому всем рассказывать, что flush'ить stdin не кошерно? :D

0
Nameless One
06.08.2012, 09:24
  #14

Не по теме:

fasked, так я же не сам рассказываю, я всего лишь ссылки даю :)

0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 2
06.08.2012, 09:26 15

Не по теме:

Nameless One, так я как раз о том, что только ссылка и есть.


На правах рекламы оставлю линк на пост в своем бложике https://www.cyberforum.ru/blogs/42536/blog278.html - про scanf, который не ждет и про gets, который использовать плохо
1
Nameless One
06.08.2012, 09:41
  #16

Не по теме:

fasked, невнимательно прочитал. Ну так да, только за последнее время несколько раз про fflush(stdin) говорили

0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
08.08.2012, 15:02 17
Цитата Сообщение от korviness
C
1
2
3
    printf ("Введите количество покупок\n");
 
    scanf ("%d", &number);
C
1
2
3
    printf ("Введите количество покупок\n");
 
    scanf ("%d%*c", &number);
0
08.08.2012, 15:02
cpp_developer
Эксперт
20123 / 5690 / 417
Регистрация: 09.04.2010
Сообщений: 12,546
Блог
08.08.2012, 15:02
Помогаю со студенческими работами здесь

Русский язык в ввода-выводе через printf-scanf
Здравствуйте! Помогите пожалуйста... Мне нужно к программе подключить возможность работать с...

Как сделать так, чтобы функция scanf ожидала ввода
как сделать так чтобы функция scanf ожидала ввода столько сколько надо а не вырубалась через...

Расчитать значения переменных y и z по заданным формулам, используя для ввода/вывода scanf и printf
Расчитать значения переменных y и z по заданным формулам . Использовать для ввода функцию scanf,...

Расчитать значения переменных y и z по заданным формулам, используя для ввода/вывода scanf и printf
Расчитать значения переменных y и z по заданным формулам (табл. 1). Использовать для ввода функцию...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Блоги программистов
Обновление сайта www.historian.b­y
Reglage 05.01.2025
Обещал подвести итоги 2024 года для сайта. Однако начну с того, что изменилось за неделю. Добавил краткий урок по последовательности действий при анализе вредоносных файлов и значительно улучшил урок. . .
Как использовать GraphQL в C# с HotChocolate
Programming 05.01.2025
GraphQL — это современный подход к разработке API, который позволяет клиентам запрашивать только те данные, которые им необходимы. Это делает взаимодействие с API более гибким и эффективным по. . .
Модель полного двоичного суматора с помощью логических операций (python)
AlexSky-coder 04.01.2025
def binSum(x:list, y:list): s=^y] p=x and y for i in range(1,len(x)): s. append((x^y)^p) p=(x and y)or(p and (x or y)) return s x=list() y=list()
Это мы не проходили, это нам не задавали...(аси­­хронный счётчик с управляющим сигналом задержки).
Hrethgir 04.01.2025
Асинхронный счётчик на сумматорах (шестиразрядный по числу диодов на плате, но наверное разрядов будет больше - восемь или шестнадцать, а диоды на старшие), так как триггеры прошли тестирование и. . .
Руководство по созданию бота для Телеграм на Python
IT_Exp 04.01.2025
Боты для Телеграм представляют собой автоматизированные программы, которые выполняют различные задачи, взаимодействуя с пользователями через интерфейс мессенджера. В данной статье мы рассмотрим,. . .
Применение компонентов PrimeVue в Vue.js 3 на TypeScript
BasicMan 04.01.2025
Введение в PrimeVue и настройка окружения PrimeVue представляет собой мощную библиотеку компонентов пользовательского интерфейса для Vue. js 3, которая предоставляет разработчикам богатый набор. . .
Как стать Senior developer
cpp_developer 04.01.2025
В современной индустрии разработки программного обеспечения позиция Senior Developer представляет собой не просто следующую ступень карьерной лестницы, а качественно новый уровень профессионального. . .
Что известно о дате выхода Windows 12 и чего от нее ждать
IT_Exp 04.01.2025
В мире технологий постоянно происходят изменения, и операционные системы не являются исключением. Windows 11, выпущенная в октябре 2021 года, принесла множество инноваций и улучшений, но. . .
Что новенького в .NET Core 9
Programming 04.01.2025
Обзор ключевых изменений в . NET Core 9 Платформа . NET Core продолжает активно развиваться, и версия 9 представляет собой значительный шаг вперед в эволюции этой технологии. Новый релиз. . .
Инструкция по установке python3.13.1 в Debian 12
AlexSky-coder 03.01.2025
sudo apt update sudo apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev wget. . .
Затестил триггеры. архив проекта прилагаю с GOA файлами в настройках архиватора проектов.
Hrethgir 03.01.2025
В этот раз нет закольцованности, потому что от неё только глюки, как я понял, логика не вырезанная. Триггеры очень быстрые если верить измерениям с помощью анализатора от Gowin. Есть ещё регистры,. . .
Python в помощь DevOps
IT_Exp 03.01.2025
Причины использования Python в работе DevOps Python стал неотъемлемой частью мира DevOps, и это не случайно. Этот язык программирования обладает множеством преимуществ, которые делают его. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru