Что-то вроде
cin >> Delay1;
if(cin) { ... }
не будет работать в соответствии с вашей спецификацией, потому что cin
пропустит первые пробелы. Пользователь не может просто нажать Enter. Сначала он должен ввести текст. Если он вводит следующее
3a
Затем вход считывается в двойном, до a
, где он останавливается. cin
не найдет ничего плохого и оставляет a
в потоке. Я думаю, что для этого достаточно обработки ошибок. Но если требуется, чтобы вы действительно повторяли, когда пользователь вводит что-то подобное, то вам нужно немного больше кода.
Если вы хотите проверить, является ли весь ввод до новой строки числом, то вы должны использовать getline
, прочитать в строку и затем попытаться преобразовать в число
string delay;
if(!getline(std::cin, delay) || !isnumber(delay)) {
...
}
Функция isnumber
может использовать поток строк для проверки строки
bool isnumber(string const &str) {
std::istringstream ss(str);
double d;
// allow leading and trailing whitespace, but no garbage
return (ss >> d) && (ss >> std::ws).eof();
}
operator>>
будет использовать первые пробелы, а std::ws
будет использовать конечные пробелы. Если он достигнет конца потока, он выдаст сигнал eof
. Таким образом, вы можете сразу же сообщить пользователю об ошибке, а не при следующей попытке чтения из cin
.
Напишите аналогичную функцию, которая возвращает double или передает адрес double в `isnumber, чтобы он мог записать результат в случае успешного разбора.
Также стоит взглянуть на различные флаги ошибок и их отношение к operator void*
, operator!
, good()
, fail()
, bad()
и eof()
, которые могут быть довольно запутанными:
flag | badbit | failbit | eofbit
function | | |
-----------------+---------+-----------+--------
op void* | x | x |
-----------------+---------+-----------+--------
op ! | x | x |
-----------------+---------+-----------+--------
good() | x | x | x
-----------------+---------+-----------+--------
fail() | x | x |
-----------------+---------+-----------+--------
bad() | x | |
-----------------+---------+-----------+--------
eof() | | | x
-----------------+---------+-----------+--------
Существует x
, если соответствующий бит влияет на результат. operator void*
используется при преобразовании в bool
(if(cin) ...
), а operator!
используется для выполнения кода !cin
.