Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
_Iskader
0 / 0 / 0
Регистрация: 05.12.2017
Сообщений: 2
1

Непонятное завершение цикла while

05.12.2017, 21:52. Просмотров 731. Ответов 5
Метки нет (Все метки)

Всем привет!
У меня возникла проблема с программой.
Суть:
Есть цикл, внутри switch(), за ним вызов собственной функции Print_Menu(), потом scanf() или getchar().
Все работает корректно до тех пор пока порядок действий не доходит до scanf()/getchar() внутри цикла.
Программа не дает ввести данные и вышибает из цикла на завершение программы.
Вопрос:
В чем причина?
Код:
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
printf("\t\t\tABC Mail Order Grocery\n");
    Print_Menu();
    ch=getchar();
    //scanf("%c",&ch);
    while( (ch=='a')||(ch=='b')||(ch=='c') ){
 
        switch(ch){
            case 'a' :
                for(i_num=DLINA_POLOS;i_num>0;i_num--)
                    printf("*");
                printf("\nВы заказываете товар: Артишок\n");
                printf("Введите вес товара в фунтах:");
                scanf("%f",&f_v_artish);
                v_artish+=f_v_artish;
                break;
            case 'b' :
                for(i_num=DLINA_POLOS;i_num>0;i_num--)
                    printf("*");
                printf("\nВы заказываете товар: Морковь\n");
                printf("Введите вес товара в фунтах:");
                scanf("%f",&f_v_mork);
                v_mork+=f_v_mork;
                break;
            case 'c' :
                for(i_num=DLINA_POLOS;i_num>0;i_num--)
                    printf("*");
                printf("\nВы заказываете товар: Свеклу\n");
                printf("Введите вес товара в фунтах:");
                scanf("%f",&f_v_svekl);
                v_svekl+=f_v_svekl;
                break;
        }
 
        Print_Menu();
        ch=getchar();
 
        //scanf("%c",&ch);
    }
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.12.2017, 21:52
Ответы с готовыми решениями:

Правильное завершение цикла getchar
есть программа, считывает данные пользователя и считает количество определенных букв. не получается...

Завершение бесконечного цикла по нажатию CTRL + D
Имеется программа, которая должна брать вводимые числа из массива и выводить всё описанное....

Завершение цикла при вводе "end", не работает программа
Здравствуйте. Почему код не делает то, чего я от него прошу? Ну, то есть, прекращать ввод как...

Резкое и непонятное завершение программы
Основная программа: program Ind5_demo; {$APPTYPE CONSOLE} {Çàäàíà ìàòðèöÿ (n?m). Âèçíà÷èòè...

Непонятное завершение программы после выполнения участка кода
Создал проект Windows Forms в нем при загрузке окна выполняетс private: System::Void...

5
Megageorgio
78 / 80 / 66
Регистрация: 03.04.2017
Сообщений: 216
Завершенные тесты: 1
06.12.2017, 17:46 2
Лучший ответ Сообщение было отмечено _Iskader как решение

Решение

_Iskader, попробуй использовать fflush(stdin) перед вводом, если не сработает - кинь полный код сюда или в личку, будем разбираться
1
tmpValue
41 / 74 / 15
Регистрация: 04.10.2017
Сообщений: 284
06.12.2017, 18:41 3
_Iskader, нажимая клавишу enter ты посылаешь на ввод еще один символ. Заверши ввод символом EOF. В linux это ctrl+D.
1
_Iskader
0 / 0 / 0
Регистрация: 05.12.2017
Сообщений: 2
06.12.2017, 20:48  [ТС] 4
Сегодня немного поработал с циклом.
Получилось, что в случае смены условия на ch!='q' (для выхода) все вполне работает!
Попробовал по совету использовать fflush(stdin) и все получилось на имеющимся условии цикла!
По поводу совета добавить EOF то я пока не понимаю каким образом мне это реализовать!
Всем спасибо за советы!
0
LightProger
38 / 38 / 15
Регистрация: 29.12.2016
Сообщений: 291
06.12.2017, 21:19 5
_Iskader, Есть два способа заставить scanf нормально функционировать, первый способ описан в одном из учебников по языку Си, в теле scanf, перед заполнителем ставить пробел, например: scanf(" %d", &a); Второй способ рекомендует мой наставник, после каждого scanf, очищать память с помощью функции getchar(), без привязки к какой-либо переменной, например:
C
1
2
scanf("%d", &a);
getchar();
1
tmpValue
41 / 74 / 15
Регистрация: 04.10.2017
Сообщений: 284
07.12.2017, 05:21 6
_Iskader, вот о чем я и говорил:
Цитата Сообщение от LightProger Посмотреть сообщение
Второй способ рекомендует мой наставник, после каждого scanf, очищать память с помощью функции getchar()
Это значит что в потоке ввода остается код символа '\n' (клавиша enter) и он будет "скушан" следующим вызовом функции getchar. Поэтому проще не засорять ввод лишним символом и послать сигнал оконцания ввода EOF. В linux он посылается комбинацией клавиш ctrl+D, в windows попробуй ctrl+Z как советует гугл.

Добавлено через 6 минут
и выглядеть это будет примерно так
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  int ch;
  while ((ch = getchar()) != EOF)
    {
      switch (ch)
    {
    case 'a':
      ...
      break;
    case 'b':
      ...
      break;
    case 'c':
      ...
      break;
    default:
      ...;
    }
    }
1
07.12.2017, 05:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.12.2017, 05:21

Непонятное значение параметра цикла for
Доброго времени суток, объясните мне пожалуйста почему, когда я указываю for (int i=100; i<=999;...

Досрочное завершение цикла for
for (int i = 0; i < n; i++) { cin >> names >> scores; } // прекратить ввод введение строки...

Завершение цикла извне
Здравствуйте! Как можно завершить функцию или цикл с помощью команды извне? Есть функция, внутри...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru