При попытке ввода числа в переменную из - за ошибки в сравнении на положительное число программа перестает реагировать
#include <iostream>
#include <string>
using namespace std;
int main() {
setlocale(LC_ALL, "RU");
int a;
cout << "Введите положительной число\n";
cin >> a;
if (a <= 0) {
cout << "Ошибка, введите еще раз\n";
cin >> a;
while (a <= 0);
}
else if (cin.fail()) {
cout << "Ошибка введите еще раз\n";
cin >> a;
while (a <= 0);
}
else {
cout << a;
}
}
Ответы (3 шт):
Автор решения: Matvj
→ Ссылка
Goop_gooprn, прав. Цитата:
А каким образом заставить прекращать цикл, вводя требуемое число?
Поднял while
над cin
и cout
, но при if(cin.fail())
выдаётся как раз таки бесконечное предложение ввести ещё раз, а ввод не начинается.
Я думаю, всю вашу конструкцию с условиями, начиная с cin>>a
и до конца, можно заменить на:
while(cin >> a)
{
if(a <= 0)
{
cout << "Ошибка введите ещё раз\n";
}
else break;
}
Автор решения: user7860670
→ Ссылка
Стоит избавиться от копипасты и начать корректно обрабатывать флаги состояния потока, не забывая вычитывать оставшиеся мусорные символы в случае fail
.
#include <iostream>
#include <string>
#include <cassert>
int main()
{
::std::cout << "Введите положительной число" << ::std::endl;
int a{};
for (;;)
{
if (::std::cin >> a)
{
if (0 < a)
{
break;
}
}
else
{
if (::std::cin.eof() or ::std::cin.bad())
{
// получить дальнейший ввод нельзя
a = 42;
break;
}
assert(::std::cin.fail());
::std::cin.clear();
// вычитываем до конца строку с невалидным числом
::std::string garbage{};
::std::cin >> garbage;
}
::std::cout << "Ошибка, введите ещё раз" << ::std::endl;
continue;
}
::std::cout << "ok " << a << ::std::endl;
return 0;
}
Автор решения: dahoonpao
→ Ссылка
Самый простой вариант:
#include <iostream>
#include <string>
using namespace std;
int a;
int main() {
setlocale(LC_ALL, "RU");
while (a <= 0)
{
cout << "Введите положительной число\n";
cin >> a;
}
}