Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
FrostDamage1488
0 / 0 / 0
Регистрация: 13.02.2016
Сообщений: 3
13.02.2016, 14:43     Почему при вводе числа программа работает нормально, а при вводе буквы уходит в бесконечный цикл? #1
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 - то просят ввести цифру заново. Но если я введу любую букву, то будет высвечиваться "Для продолжения введите любую клавишу..." до бесконечности. Что это такое и каким образом исправить?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.02.2016, 14:43     Почему при вводе числа программа работает нормально, а при вводе буквы уходит в бесконечный цикл?
Посмотрите здесь:

почему то при вводе числа не выдает сумму C++
C++ почему при вводе в массив числа отличного от 1 и 2 все равно происходит начисление К +1
C++ При вводе нуля,программа не правильно работает
C++ Цикл не прерывается при вводе Enter
Почему программа уходит в рекурсию при передачи в нее буквы C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Dreamer_0x01
246 / 73 / 25
Регистрация: 29.10.2015
Сообщений: 187
13.02.2016, 14:53     Почему при вводе числа программа работает нормально, а при вводе буквы уходит в бесконечный цикл? #2
1) А что такое choice, как и где она объявлена?
2) Потенциально опасное место - рекурсивный вызов maimenu. Стек вызовов в течение всей работы программы растет и не освобождается. Спустя какое-то время программа гарантированно свалится. Лучше делать вызов mainmenu() в цикле из main().
MuslimPalit
 Аватар для MuslimPalit
30 / 6 / 2
Регистрация: 23.03.2015
Сообщений: 467
13.02.2016, 15:00     Почему при вводе числа программа работает нормально, а при вводе буквы уходит в бесконечный цикл? #3
код низкого уровня! Ты входишь в цикл if(choise == 1) так как ты ввел эту переменную 1 условие повторяется бесконечно, должен быть выход(принудительный), если не меняется условие, вставь break. Если ты вводишь другую цифру функция повторяется, так как идет рекурсия, а условие не выполняется, потомучто не истинно. И если ты пишешь букву программа просто игнорирует, потому что надо задать тип. Лучше пересмотри: типы данных, функции, условия, циклы. Побдробнее их почитаешь будешь лучше видеть код

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

Добавлено через 1 минуту
Если я ввожу 1, то повторяется не бесконечно. После очередного вызова mainmenu() мне нужно заново вводить значение choice. А принудительный выход мне и не нужен. У меня большая программа, в общем, и там наоборот нужно, чтобы после выполнения условия возвращало обратно в начало. Я сделал это так.
Dreamer_0x01
246 / 73 / 25
Регистрация: 29.10.2015
Сообщений: 187
13.02.2016, 16:07     Почему при вводе числа программа работает нормально, а при вводе буквы уходит в бесконечный цикл? #5
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Понятно. Если 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() убрать рекурсивный вызов.
FrostDamage1488
0 / 0 / 0
Регистрация: 13.02.2016
Сообщений: 3
13.02.2016, 16:48  [ТС]     Почему при вводе числа программа работает нормально, а при вводе буквы уходит в бесконечный цикл? #6
Тему можно закрыть. Дело было в том, что я вызывал функцию в функции, это и повлекло за собой бесконечный цикл. Нашел решение, чтобы не вылетало при написании буквы. Нужно изменить choice из int на char, тогда все отлично работает. Если нужно кому-то.
Yandex
Объявления
13.02.2016, 16:48     Почему при вводе числа программа работает нормально, а при вводе буквы уходит в бесконечный цикл?
Ответ Создать тему
Опции темы

Текущее время: 12:53. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru