Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.92/25: Рейтинг темы: голосов - 25, средняя оценка - 4.92
0 / 0 / 0
Регистрация: 13.02.2016
Сообщений: 3
1

Почему при вводе числа программа работает нормально, а при вводе буквы уходит в бесконечный цикл?

13.02.2016, 14:43. Просмотров 4683. Ответов 5
Метки нет (Все метки)


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void mainmenu()
{
cout << "Введи число" << endl;
cin >> choice;
if (choice == 1) {
cout << "Hello" << endl;
}
system("pause");
mainmenu();
}
int main()
{
setlocale(LC_ALL, "RUSSIAN");
mainmenu();
}
Есть часть кода. Если я ввожу цифру 1 - проигрывается действия условия if. Если ввожу любую цифру, кроме 1 - то просят ввести цифру заново. Но если я введу любую букву, то будет высвечиваться "Для продолжения введите любую клавишу..." до бесконечности. Что это такое и каким образом исправить?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.02.2016, 14:43
Ответы с готовыми решениями:

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

InputMismatchException почему бесконечный цикл при вводе?
Всем доброго времени! Изучаю исключения в Java. Написал небольшую тестовую программу. Смысл в том,...

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

Объяснить почему при заполнении матрицы программа уходит в бесконечный цикл
#include &lt;iostream&gt; using namespace std; int main() { int mas; for (int i = 0; i &lt; 3;) {...

5
259 / 86 / 30
Регистрация: 29.10.2015
Сообщений: 196
13.02.2016, 14:53 2
1) А что такое choice, как и где она объявлена?
2) Потенциально опасное место - рекурсивный вызов maimenu. Стек вызовов в течение всей работы программы растет и не освобождается. Спустя какое-то время программа гарантированно свалится. Лучше делать вызов mainmenu() в цикле из main().
0
30 / 6 / 9
Регистрация: 23.03.2015
Сообщений: 508
13.02.2016, 15:00 3
код низкого уровня! Ты входишь в цикл if(choise == 1) так как ты ввел эту переменную 1 условие повторяется бесконечно, должен быть выход(принудительный), если не меняется условие, вставь break. Если ты вводишь другую цифру функция повторяется, так как идет рекурсия, а условие не выполняется, потомучто не истинно. И если ты пишешь букву программа просто игнорирует, потому что надо задать тип. Лучше пересмотри: типы данных, функции, условия, циклы. Побдробнее их почитаешь будешь лучше видеть код

Добавлено через 3 минуты
Решение всех задач из учебника Стивена Прата
вот составленные правильно программы, рассмотри их код и поймешь чего не хватает
0
0 / 0 / 0
Регистрация: 13.02.2016
Сообщений: 3
13.02.2016, 15:15  [ТС] 4
choice - переменная типа int, объявленная заранее

Добавлено через 1 минуту
Если я ввожу 1, то повторяется не бесконечно. После очередного вызова mainmenu() мне нужно заново вводить значение choice. А принудительный выход мне и не нужен. У меня большая программа, в общем, и там наоборот нужно, чтобы после выполнения условия возвращало обратно в начало. Я сделал это так.
0
259 / 86 / 30
Регистрация: 29.10.2015
Сообщений: 196
13.02.2016, 16:07 5
Лучший ответ Сообщение было отмечено FrostDamage1488 как решение

Решение

Понятно. Если cin ожидает int, а вы вводите другое - возникает ошибка потока, которую нужно либо проверять, либо обрабатывать.

Вот тут хорошие рассуждения на эту тему нашел:
http://www.linux.org.ru/forum/development/5305320

Добавлено через 2 минуты
Цитата Сообщение от FrostDamage1488 Посмотреть сообщение
У меня большая программа
А вот из-за этого тем более нужно избавиться от рекурсивного вызова.
Иначе, это бомба замедленного действия. Рекурсия всегда должна быть конечной. Если у вас она получается бесконечной - заменить ее на цикл.
C++
1
2
3
4
5
6
7
8
9
10
int main()
{
setlocale(LC_ALL, "RUSSIAN");
while(1)
{
mainmenu();
}
}
 
//и из самой mainmenu() убрать рекурсивный вызов.
1
0 / 0 / 0
Регистрация: 13.02.2016
Сообщений: 3
13.02.2016, 16:48  [ТС] 6
Тему можно закрыть. Дело было в том, что я вызывал функцию в функции, это и повлекло за собой бесконечный цикл. Нашел решение, чтобы не вылетало при написании буквы. Нужно изменить choice из int на char, тогда все отлично работает. Если нужно кому-то.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.02.2016, 16:48

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Бесконечный цикл при вводе букв
Почему если ввести в переменную управляющую циклом символ, при том ,что это переменная типа int,...

Бесконечный цикл при вводе букв
Написал простую программку, в которой считается площадь, высота и диагонали параллелограмма. Через...

Бесконечный цикл при вводе несоответствующего типа данных
Цикл, который просит ввести пользователя число, если это число ни одно из чисел 1, 2 или 3, то цикл...

Почему цикл на при 1 уходит в бесконечный цикл?
#define _CRT_SECURE_NO_WARNINGS #include &lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;string.h&gt; int...


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

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

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