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

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

13.02.2016, 14:43. Просмотров 1027. Ответов 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)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.02.2016, 14:43
Ответы с готовыми решениями:

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

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

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

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

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

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

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

Добавлено через 1 минуту
Если я ввожу 1, то повторяется не бесконечно. После очередного вызова mainmenu() мне нужно заново вводить значение choice. А принудительный выход мне и не нужен. У меня большая программа, в общем, и там наоборот нужно, чтобы после выполнения условия возвращало обратно в начало. Я сделал это так.
0
Dreamer_0x01
258 / 85 / 30
Регистрация: 29.10.2015
Сообщений: 192
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
FrostDamage1488
0 / 0 / 0
Регистрация: 13.02.2016
Сообщений: 3
13.02.2016, 16:48  [ТС] 6
Тему можно закрыть. Дело было в том, что я вызывал функцию в функции, это и повлекло за собой бесконечный цикл. Нашел решение, чтобы не вылетало при написании буквы. Нужно изменить choice из int на char, тогда все отлично работает. Если нужно кому-то.
0
13.02.2016, 16:48
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.02.2016, 16:48

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

Объяснить почему программа уходит в бесконечный цикл (связные списки)
Всем привет. Собрал связанный список, он работает, но при вводе типа char,...

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


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

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

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