Как я проверил бы, является ли вход действительно двойным?
double x;
while (1) {
cout << '>';
if (cin >> x) {
// valid number
break;
} else {
// not a valid number
cout << "Invalid Input! Please input a numerical value." << endl;
}
}
//do other stuff...
Вышеупомянутый код бесконечно производит Invalid Input!
оператор, таким образом, не запрос другого входа. Я хочу запросить вход, проверить, законно ли..., если это - двойное, продолжите..., если это не двойное, быстрое снова.
Какие-либо идеи?
Попробуйте следующее:
while (1) {
if (cin >> x) {
// valid number
break;
} else {
// not a valid number
cout << "Invalid Input! Please input a numerical value." << endl;
cin.clear();
while (cin.get() != '\n') ; // empty loop
}
}
Это в основном очищает состояние ошибки, затем читает и отбрасывает все, что было введено в предыдущей строке.
failbit
будет установлен после использования оператора извлечения, если произошла ошибка синтаксического анализа, есть пара простых тестовых функций good
и fail
] ты можешь проверить. Они полностью противоположны друг другу, поскольку обрабатывают eofbit
по-разному, но в данном примере это не проблема.
Затем вы должны очистить бит отказа
перед повторной попыткой.
Как говорит Касабланка, вы также должны отбросить нечисловые данные, все еще оставшиеся во входном буфере.
Итак:
double x;
while (1) {
cout << '>';
cin >> x;
if (cin.good())
// valid number
break;
} else {
// not a valid number
cout << "Invalid Input! Please input a numerical value." << endl;
cin.clear();
cin.ignore(100000, '\n');
}
}
//do other stuff...
Один из способов - проверить равенство чисел с плавающей запятой.
double x;
while (1) {
cout << '>';
cin >> x;
if (x != int(x)) {
// valid number
break;
} else {
// not a valid number
cout << "Invalid Input! Please input a numerical value." << endl;
}
}