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

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

05.06.2011, 18:24. Показов 3866. Ответов 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
Эксперт С++
516 / 421 / 92
Регистрация: 23.09.2010
Сообщений: 1,165
05.06.2011, 18:34
какого типа flot[i].type?
0
 Аватар для airlee
1 / 1 / 0
Регистрация: 27.11.2009
Сообщений: 54
20.11.2011, 18:58  [ТС]
flot[i].type это переменная типа char
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
20.11.2011, 19:13
Цитата Сообщение от airlee Посмотреть сообщение
flot[i].type это переменная типа char
а должна быть char *

Добавлено через 1 минуту
кстати, не забывайте и про
C
1
fflush (stdin);
а то scanf подпортит результат
0
 Аватар для airlee
1 / 1 / 0
Регистрация: 27.11.2009
Сообщений: 54
30.11.2011, 00:42  [ТС]
Я никогда не объявлял строки в виде указателей и всегда все вводилось сразу и без проблем без использования всяких посторонних библиотек.
Неужели тут нет никакой программной ошибки?
0
Заблокирован
30.11.2011, 00:46
Цитата Сообщение от airlee Посмотреть сообщение
Я никогда не объявлял строки в виде указателей и всегда все вводилось сразу и без проблем без использования всяких посторонних библиотек.
Неужели тут нет никакой программной ошибки?
Покажите объявление этого поля type в вашей структуре. Не видя объявления, трудно сказать, корректный код или нет.
0
 Аватар для airlee
1 / 1 / 0
Регистрация: 27.11.2009
Сообщений: 54
30.11.2011, 02:43  [ТС]
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
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
#define MAX 50
#define MAXPLANES 7
struct air {int serial;
        char station [MAX];
        char type [MAX];
       };
 
int vvod (struct air flot[MAXPLANES])
   {int i=0;
    printf("This programm is called \"AEROFLOT\".");
    printf("\nHer task is creating of structure, \n which contains information about airplanes.");
    printf("\nYour mission is entering of data about 7 airplanes.\n");
    printf("\nLet's begin! Enter the arriving station");
    printf("\nOr press <Enter> in name of arrive station  to quit:");
    for(i=0;i!=MAXPLANES && gets(flot[i].station)!=NULL && flot[i].station[0]!='\0';i++)
       {printf("Enter the number of airplane:");
    scanf("%d",&flot[i].serial);
    puts("Enter the type of airplane:");
    gets(flot[i].type);
    gets(flot[i].type);
    if(i!=6)
         {printf("\nYou entered %d. %d remains.\n",i+1,MAXPLANES-(i+1));
          printf("Enter arriving station:");
         }
       }
    if (i==7) return 0;
    else
       {printf("You entered empty string.");
    return 1;
       }
   }
 
void zapros (const struct air flot[])
    {int sign, count=0;
     char state [MAX];
     int i;
     printf("\nThe entering completed successfuly.\n");
     printf("Enter the arriving station and \n");
     printf("programm'll show you the airplanes which'll go there:\n");
     gets(state);
     for(i=0;i<7;i++)
    {sign=strcmp(flot[i].station,state);
     if(sign==0)
       {printf("\nThe station %s, number %d, type %s.\n",flot[i].station,flot[i].serial,flot[i].type);
        count++;
       }
    }
     if(count==0)printf("\nThere's no airplane to go there. Sorry.\n");
    }
 
 
int main (void)
     {clrscr();
      struct air dbase[MAXPLANES];
      int sign;
      sign = vvod(dbase);
      if (sign==0) zapros(dbase);
      printf("The task is over.\nPress <Enter> to quit.");
      getch();
      return 0;
     }
Это полный текст программы. На том месте, где вводится flot[i].type приходится записывать оператор дважды, так как первый в игноре, по не известной мне причине.
0
 Аватар для alkagolik
1599 / 622 / 113
Регистрация: 15.07.2011
Сообщений: 3,548
30.11.2011, 04:50
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

вот этот участок
C
1
2
3
4
5
6
7
8
9
if(i!=6)
             {printf("\nYou entered %d. %d remains.\n",i+1,MAXPLANES-(i+1));
              printf("Enter arriving station:");
             }
       }
    if (i==7) return 0;
    else
       {printf("You entered empty string.");
        return 1;
гарантирует ровно один проход по циклу и возврат 1.
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
30.11.2011, 10:17
Строка 21, затем строка 23
Если в программе вы используете scanf, то он Вам подпортит результат
Поэтому для решения перед каждым gets пишем
C++
1
fflush (stdin);
И Ваша проблема будет решена
А вообще так совет, читайте внимательно, а не через строки. Я уже говорил https://www.cyberforum.ru/post2192931.html

Добавлено через 32 секунды
Цитата Сообщение от Сыроежка Посмотреть сообщение
Покажите объявление этого поля type в вашей структуре.
Читайте внимательно первый пост
0
 Аватар для airlee
1 / 1 / 0
Регистрация: 27.11.2009
Сообщений: 54
30.11.2011, 15:27  [ТС]
Alkagolic, я проверял прогу несколько раз. У меня она работает, нужную задачу решает.

Go, Я никогда прежде с этой функцией не сталкивался. Что она делает? И есть ли в Си такой оператор, так как лаба эта по Си, не ++.
И тогда уж наверное проще еще один gets() поставить, если что-то добавлять)
Он же по сути без всяких вспомогательных функций должен принимать значение ... Почему компайлер его игнорирует?

Добавлено через 3 минуты
Эта функция возвращает единицу, если база не заполнена 7ю элементами.
Возвращает 0 в противном случае и только при этом условии выполняет запрос на поиск нужного самолета.
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
30.11.2011, 16:26
Цитата Сообщение от go
Поэтому для решения перед каждым gets пишем
C++
1
fflush (stdin);
нельзя вызывать fflush() для потоков ввода, это непереносимо

C
1
    scanf("%d%*с", &flot[i].serial);
2
 Аватар для airlee
1 / 1 / 0
Регистрация: 27.11.2009
Сообщений: 54
30.11.2011, 18:26  [ТС]
но flot[i].serial везде записывается и выводится одинаково успешно О_о
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
30.11.2011, 21:00
Цитата Сообщение от accept Посмотреть сообщение
нельзя вызывать fflush() для потоков ввода, это непереносимо
Вы очень сильно ошибаетесь, есть файл, который связан с консолью
Без этой функции вы не сможете воспользоваться gets
Сравните
C
1
2
3
4
5
6
7
8
9
10
11
12
int a,
char s[10],ss[10];
 
scanf ("%d", &a);
 
gets (s);
 
fflush (stdin);
gets (ss);
 
printf ("\n%s\n%s", s,ss);
   // Вы очень сильно удивитесь, что данные в ss будут верными, а в s нет!!!
airlee, решение вашей проблемы я описал два раза
0
 Аватар для alkagolik
1599 / 622 / 113
Регистрация: 15.07.2011
Сообщений: 3,548
30.11.2011, 21:25
go, ага, я понял. Вы говорите об очищении потока после вызова scanf(). Да есть такая беда, но товарищ accept показал решение.
2
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
30.11.2011, 21:36
alkagolik, дело в том, что после работы scanf в буфере клавиатуры остался '\n', и gets его считывает, и получается неверный результат

Добавлено через 1 минуту
поэтому принято перед гетсом чистить буфер клавиатуры
Напомню, такой вариант ввода, вводит строку до пробела
C
1
scanf ("%s", s);
0
 Аватар для alkagolik
1599 / 622 / 113
Регистрация: 15.07.2011
Сообщений: 3,548
30.11.2011, 21:39
можно вообще все gets() заменить на scanf().
0
 Аватар для airlee
1 / 1 / 0
Регистрация: 27.11.2009
Сообщений: 54
30.11.2011, 21:51  [ТС]
Можно, согласен, пробовал, как я помню, не помогло ...
То есть, как я смекнул, лучше всего избегать ввод данных в подпрограммах и что подпроги нужны только для операций с переменными главной функции, эйме? )
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
30.11.2011, 22:02
Цитата Сообщение от airlee Посмотреть сообщение
То есть, как я смекнул, лучше всего избегать ввод данных в подпрограммах
С чего вы взяли???

Добавлено через 23 секунды
Просто перед каждым gets напишите
C
1
fflush (stdin);
0
 Аватар для alkagolik
1599 / 622 / 113
Регистрация: 15.07.2011
Сообщений: 3,548
30.11.2011, 22:02
airlee, как это не помогло? может просто не то делали?
C
1
scanf("%s", flot[i].type);
0
 Аватар для airlee
1 / 1 / 0
Регистрация: 27.11.2009
Сообщений: 54
30.11.2011, 22:07  [ТС]
Go, как мне известно, & - присваивает адрес переменной, в вашем случае переменной s. Без этого знака он действительно будет записывать его, и мне опять лапши навешали в универе??
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.11.2011, 22:07
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru