Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 5.00/18: Рейтинг темы: голосов - 18, средняя оценка - 5.00
 Аватар для airlee
1 / 1 / 0
Регистрация: 27.11.2009
Сообщений: 54

В приведенной функции игнорируется ввод строки в переменную

05.06.2011, 18:24. Показов 4197. Ответов 39

Студворк — интернет-сервис помощи студентам
Люди, помогите, пожалуйста ) Не могу понять ...
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int vvod (struct air flot[])
{int = 0;
 printf("...");
 while(i<7 && gets(flot[i].station)!=NULL && flot[i].station[0]!='\0')
        {printf("...");
          scanf("%d",&flot[i].serial);
          printf("...");
          gets(flot[i].type);
          i++;
          if(i<7) printf("...");
         }
 if(flot[i].station[0]=='\0')
   {printf("...");
     return 0;
    }
 else return 0;
}
В приведенной мной функции игнорируется ввод строки в переменную flot[i].type. Помогите, пожалуйста, мне понять в чем ошибка )
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.06.2011, 18:24
Ответы с готовыми решениями:

Игнорируется ввод строки через консоль
Здравствуйте! У меня возникла проблема с вводом строки. Когда я запускаю выполнение программы, то происходит игнорирование первого...

Почему игнорируется ввод букв?
Почему именно в этой программе игнорирует ввод букв, если отдельно вынести эти строки в другую программу, т овсе работает var ...

Ввод пустой строки и ее запись в переменную
Нужно вводить в консоли несколько строк подряд, среди которых может быть пустая. Ввожу первую, нажимаю enter, ввожу следующую и т.д. Это...

39
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
30.11.2011, 22:09
Студворк — интернет-сервис помощи студентам
airlee, амперсанд получает адрес переменной, т.е. мы вводим по адресу, но в вашем случае имя массива - это уже указатель
0
 Аватар для airlee
1 / 1 / 0
Регистрация: 27.11.2009
Сообщений: 54
30.11.2011, 22:09  [ТС]
Цитата Сообщение от alkagolik Посмотреть сообщение
airlee, как это не помогло? может просто не то делали?
C
1
scanf("%s", flot[i].type);
Я делал, но добавил перед flot[i].type знак адресации. Его присутствие сыграло роль??
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
30.11.2011, 22:12
Не совсем понял ваш вопрос?
Может приведете пример?

Добавлено через 1 минуту
Цитата Сообщение от airlee Посмотреть сообщение
Его присутствие сыграло роль??
Да, у вас это массив, и его имя уже адрес, амперсанд в данном случае не нужен

Добавлено через 1 минуту
airlee, я смотрел ваш код, неужели так сложно сделать https://www.cyberforum.ru/post2232614.html
0
 Аватар для alkagolik
1599 / 622 / 113
Регистрация: 15.07.2011
Сообщений: 3,548
30.11.2011, 22:40
Цитата Сообщение от airlee Посмотреть сообщение
Go, как мне известно, & - присваивает адрес переменной, в вашем случае переменной s. Без этого знака он действительно будет записывать его, и мне опять лапши навешали в универе??
нет & изымает адрес идентификатора справа от него, а не присваивает его. Т. к. у вас объявлен массив символов arr[10], то адрес &arr[0] == arr. Таким же образом передаются аргументы в функции, которые принмают указатели. Поскольку scanf() принимает вторым и более ургументами указатели. пример
C
1
2
3
4
5
int p;
int *x;
char arr[10];
 
scanf("%i%i%s", &p, x, arr);
Добавлено через 53 секунды
Цитата Сообщение от airlee Посмотреть сообщение
Я делал, но добавил перед flot[i].type знак адресации. Его присутствие сыграло роль??
конечно. смотрите пример выше
0
4866 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
30.11.2011, 23:28
Цитата Сообщение от go
Вы очень сильно ошибаетесь, есть файл, который связан с консолью
Без этой функции вы не сможете воспользоваться gets
прочитай описание функции fflush()

Цитата Сообщение от go
alkagolik, дело в том, что после работы scanf в буфере клавиатуры остался '\n', и gets его считывает, и получается неверный результат
поэтому принято перед гетсом чистить буфер клавиатуры
считывание перевода
ты не можешь почисить буфер stdin, потому что нет такой возможности
функция fflush() даёт неопределённой поведение, когда её вызывают для потока ввода, а stdin - поток ввода
есть расширения компиляторов, при которых функция fflush() очищает поток ввода, но они не обязаны быть единообразными и одинаково работать
все компиляторы не обязаны поддерживать это расширение
программа, скомпилированная в них, может просто выпасть
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
01.12.2011, 13:50
Цитата Сообщение от accept Посмотреть сообщение
прочитай описание функции fflush()
Вот, с чего вам нужно и начинать http://www.cplusplus.com/refer... dio/stdin/

Цитата Сообщение от accept Посмотреть сообщение
все компиляторы не обязаны поддерживать это расширение
программа, скомпилированная в них, может просто выпасть
Пример приведите,
без fflush использование gets не возможно да и сканфа тоже
0
4866 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
01.12.2011, 13:54
Цитата Сообщение от go
Вот, с чего вам нужно и начинать
вот с чего не нужно начинать, так это с того студенческого сайта
читай стандарт C
C и C++ - разные языки

Цитата Сообщение от go Посмотреть сообщение
без fflush использование gets не возможно да и сканфа тоже
не знаешь ни того, ни другого, ни третьего
черновик стандарта доступен в интернете
0
go
01.12.2011, 14:20

Не по теме:

Цитата Сообщение от accept Посмотреть сообщение
не знаешь ни того, ни другого, ни третьего
А у меня сложилось впечатление, что вы вообще языка не знаете, так как не умеете работать с вводом-выводом... Ну что тут сказать, ни чем помочь в данный момент не могу

0
Эксперт JavaЭксперт С++
 Аватар для M128K145
8384 / 3618 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
01.12.2011, 14:46
Цитата Сообщение от go Посмотреть сообщение
А у меня сложилось впечатление, что вы вообще языка не знаете, так как не умеете работать с вводом-выводом... Ну что тут сказать, ни чем помочь в данный момент не могу
Открывайте книжки, читайте и учите язык с нуля, будут какие-то вопросы - спрашивайте, помогу в обучении.
Почитайте интернет на тему UB, загуглите
"fflush stdin why not"
один из результатов и там же есть ссылка на FAQ с примерами о том, как правильно чистить буфер
, а потом уже утверждайте кто что знает, а кто чего не знает. На данный момент вы сильно ошибаетесь
0
4866 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
01.12.2011, 14:49
да, даже на сайте, который он привёл, написано про fflush()
но он даже это дело не прочитал, прежде чем спорить
хоть там и витиевато
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
01.12.2011, 14:52
M128K145, нет, вы мне просто ответьте: как как же пользоваться gets без fflush?!

Добавлено через 1 минуту
Цитата Сообщение от M128K145 Посмотреть сообщение
Почитайте интернет на тему UB, загуглите "fflush stdin why not"
Почитал, всеравно, в очередной раз убедился, что автор флуда не прав
0
Эксперт JavaЭксперт С++
 Аватар для M128K145
8384 / 3618 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
01.12.2011, 14:52
Цитата Сообщение от go Посмотреть сообщение
нет, вы мне просто ответьте: как как же пользоваться gets без fflush?!
Я же привел ссылку. Вот решение
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
/*
 *  This C implementation will clear the input buffer.
 *  The chances are that the buffer will already be empty,
 *  so the program will wait until you press [Enter].
 */
 
#include <stdio.h> 
 
int main(void)
{
  int   ch;
  char  buf[BUFSIZ];
  
  puts("Flushing input");
  
  while ((ch = getchar()) != '\n' && ch != EOF);
  
  printf ("Enter some text: ");
  
  if (fgets(buf, sizeof(buf), stdin))
  {
    printf ("You entered: %s", buf);
  }
  
  return 0;
}
 
/*
 * Program output:
 *
 Flushing input
 blah blah blah blah
 Enter some text: hello there
 You entered: hello there
 *
 */
взято с http://faq.cprogramming.com/cg... 1043284392

Цитата Сообщение от go Посмотреть сообщение
Почитал, всеравно, в очередной раз убедился, что автор флуда не прав
где флуд и из чего следует, что он не прав?
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
01.12.2011, 15:01
Цитата Сообщение от M128K145 Посмотреть сообщение
где флуд и из чего следует, что он не прав?
Сразу же после вашего поста

Добавлено через 3 минуты

Не по теме:

M128K145, может я с fflush ошибаюсь (из-за стандарта), но автору тему он поможет, так как мы пишем программу для компилятора (читайте оговорку в приведенной вами ссылке)

0
Эксперт JavaЭксперт С++
 Аватар для M128K145
8384 / 3618 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
01.12.2011, 15:04
Цитата Сообщение от go Посмотреть сообщение
Сразу же после вашего поста
А что там не так, на том сайте, на который вы ссылаетесь написано
If it was open for reading and the last operation was an input operation, the behavior depends on the specific library implementation. In some implementations this causes the input buffer to be cleared, but this is not standard behavior.
http://www.cplusplus.com/refer... io/fflush/
О чем вам и было сказано:
Цитата Сообщение от accept Посмотреть сообщение
да, даже на сайте, который он привёл, написано про fflush()
но он даже это дело не прочитал, прежде чем спорить
хоть там и витиевато
И в этом он на 100% прав.

Цитата Сообщение от go Посмотреть сообщение
но автору тему он поможет, так как мы пишем программу для компилятора (читайте оговорку в приведенной вами ссылке)
А если он использует компилятор, который не поддерживает такое поведение и программа упадет? Что тогда делать? Или вы знаете на каких компиляторах будет компилироваться этот код, и с какими компиляторами ТС будет в будущем работать?
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12844 / 7593 / 1766
Регистрация: 25.07.2009
Сообщений: 13,981
01.12.2011, 15:04
Цитата Сообщение от go Посмотреть сообщение
Пример приведите,
без fflush использование gets не возможно да и сканфа тоже
Примеров аж два: в BSD системах для очистки stdin используется fpurge, в linux __fpurge, а вот в мелкомягких fflush и для stdin и для stdout (ну по крайней мере оно там работает), но опять же, раз стандартом не оговорено, всегда есть варианты...
2
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
01.12.2011, 15:08
M128K145, Совет: если вы чистите тему, так делайте это корректно, а то мое высказывание нелепо уже стало выглядеть, после того, как вы посты затерли.

Добавлено через 3 минуты
easybudda, я вам верю (хотя мы говорим о компиляторах под winsows)
Цитата Сообщение от easybudda Посмотреть сообщение
а вот в мелкомягких fflush и для stdin и для stdout
я про это и говорил, зачем так бурно реагировать, не с кем отношения выяснять я не хочу,


Цитата Сообщение от M128K145 Посмотреть сообщение
И в этом он на 100% прав.
как видите нет
0
Эксперт JavaЭксперт С++
 Аватар для M128K145
8384 / 3618 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
01.12.2011, 15:12
Цитата Сообщение от go Посмотреть сообщение
Цитата Сообщение от M128K145 Посмотреть сообщение
И в этом он на 100% прав.
как видите нет
А в чем не прав?
Цитата Сообщение от M128K145 Посмотреть сообщение
да, даже на сайте, который он привёл, написано про fflush()
Написано? Написано. Он прав.
Цитата Сообщение от accept Посмотреть сообщение
но он даже это дело не прочитал, прежде чем спорить
вы читали про fflush на том сайте? до того как был написан его пост - скорее всего нет, а значит он прав.
Цитата Сообщение от accept Посмотреть сообщение
хоть там и витиевато
там действительно витиевато написано.


Цитата Сообщение от go Посмотреть сообщение
я про это и говорил
я еще раз повторю - где-то было сказано ТСом о целевой платформе и компиляторе?
Никто не хочет вас оскорбить или обидеть, вы поймите, эта тема поможет вам в будущем самому не совершать таких ошибок и не советовать другим совершать подобные ошибки, когда вам абсолютно ничего не известно об используемых ОС и компиляторах
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
01.12.2011, 15:17
M128K145, взгляните на код в первом посту ТС
Там явно видна ошибка, gets будет работать не правильно
И ваш друг вместо того, чтобы помочь ТС, начал выпендриваться

Цитата Сообщение от M128K145 Посмотреть сообщение
А в чем не прав?
Читайте последнюю строчку вашей ссылки http://faq.cprogramming.com/cg... 1043284351
1
Эксперт JavaЭксперт С++
 Аватар для M128K145
8384 / 3618 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
01.12.2011, 15:26
Цитата Сообщение от go Посмотреть сообщение
И ваш друг вместо того, чтобы помочь ТС, начал выпендриваться
Он указал на вашу ошибку, а не решил "выпендрится"

Цитата Сообщение от go Посмотреть сообщение
Читайте последнюю строчку вашей ссылки
go, вам в этой теме уже несколько раз об этом говорили, само сокращение UB об этом говорит, но я еще раз повторю вопрос - что вам известно о платформах и компиляторах, которые использует ТС?

Дальнейшее обсуждение предлагаю перенести ко мне в ЛС
1
 Аватар для airlee
1 / 1 / 0
Регистрация: 27.11.2009
Сообщений: 54
04.12.2011, 18:05  [ТС]
Оу-оу-оу! Товарищи! Хорош ) Мы тут пытаемся найти оптимальное и одновременно верное решение проблемы )
Как Я смекнул, проблемы возникли из-за того, что в буфере после работы приемщика данных остался символ \n (новой строки) после ввода. И следующий ввод принимает данные из буфера в виде этого символа и ... эээ ... если бы все работало правильно, то это то же самое, что я бы в процессе ввода нажал бы Enter. Ну или что-то в этом духе ...
Проблема, как я понял, решается путем очистки буфера от данных...
1. Я написал не чертову тучу программ, но все они у меня работали без fflush`а. При этом, ввод не игнорировался. Вот только со структурами данных у меня такие фокусы начали происходить ...
2. Попробовал заменить gets() на scanf() при вводе flot[i].type. Теперь код сбрасывает данные след. самолета и пишет, что я ввел пустую строку ... Но! Поставил символы %*с и все заработало, как прежде! Ничего не игнорируется ) Все работает, как и должно работать ) Всем спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.12.2011, 18:05

Что в приведенной функции опционально
Что здесь опционально? http://msdn.microsoft.com/en-us/library/windows/desktop/ms684958%28v=vs.85%29.aspx

Вывести на экран график функции, приведенной ...
Вывести на экран график функции, приведенной в Вашем индивидуальном задании. Отобразить координатную плоскость. Вывод графика производить...

Доказать примитивную рекурсивность приведённой функции
Доказать, примитивную рекурсивность приведённой функции, выражая её через простейшие с помощью операторов суперпозиции и примитивной...

Вычислить значение приведенной функции и ряда
Помогите пожалуйста. Используя оператор цикла, вычислить с заданной точностью Е приближенное значение функции, указав количество...

Программа для вычисления приведенной ниже функции
Помогите пожалуйста решить: написать оптимальную (по числу арифметических операций) программу для вычисления приведенной ниже функции: ...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru