@cubooks
Web-developer

Почему идет зацикливование программы на C++?

Добрый вечер! Такая проблема. Пишу программу (домашнее задание). Требуется получить параметр, и проверить его на какие-либо условия.

Кусочек программы:
int checked = 0;
int n;
			
			while (checked <= 0) {
				cout << "Введите параметр N=";
				cin >> n;
				
				cout << n;
				
				if ((int)n == 0) {
					cout << "Ошибка! Параметр N не должен равняться 0" << endl;
				} else {
					checked = 1;
				}
				

			}


1. При вводе 1 - хорошо
2. При вводе 0 - выводит ошибку, и просит ввести еще раз данные (хорошо)
3. При вводе 0.1 - выводит ошибку, и происходит зацикливование

Не подскажите, как решить проблему, или есть альтернативное решение данной задачи? Спасибо.
  • Вопрос задан
  • 2232 просмотра
Решения вопроса 2
Чтобы было понимание, почему так происходит, дополню:

При попытке чтения 0.1 читается только 0, так как требуется целое число, а ".1" так и остаётся в потоке. Соответственно второй раз идёт попытка прочесть целое из ".1", что приводит к ошибке, а std::cin приходит в ошибочное состояние (std::ios::failbit), n остаётся неизменным, и всё начинает идти по кругу.

Изменив на double вы исправили только это, однако введите "0.1blabla" - и всё зациклится вновь.

Решение:

1. Проверять std::cin на валидность if (std::cin) и, например, выходить, либо восстанавливать состояние:
if (!std::cin)
{
	std::cin.clear(); // очищаем флаги
	std::cin.ignore(INT_MAX, '\n'); // игнорим входной буфер до переноса строки
}
// можем пользоваться

2. Помимо этого можно попросить поток кидать исключения на ошибках, например:
std::cin.exceptions(std::ios::failbit);
Кинет исключение при неудачной попытке прочесть значение.

В вашем случае, я думаю, стоит проверять std::cin с игнорированием оставшегося ввода и восстанавливать состояние.
Ответ написан
Комментировать
0.1 - нецелое число, а переменная n типа int, который представляет только целые. Измените тип n, например, на double.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы