Мне нужно прочитать int от пользователя, использующего cin, но распечатать сообщение об ошибке, если вместо этого вводится строка. Я пытался заставить его работать, используя оператор if с cin.fail()
который работает хорошо, если введены только символы. Однако, если пользователь вводит что-то вроде 3sadi
он, кажется, читает в 3 и оставляет остальную часть строки в буфере, что не дает мне сообщение об ошибке, потому что флаг cin.fail() не установлен. Как я могу сделать это так, чтобы сообщение об ошибке было напечатано, если первый символ строки является int?
int i1;
cin >> i1;
if (cin.fail() == true) {
cout << "error" << endl;
}
else{
cout << "success" << endl;
}
например. 32
должен (и делает) печать успеха
ошибка red
(и делает)
3x
должен печатать ошибку, но успех печати и оставить x в буфере
Как я могу сделать сообщение 3x
мне сообщение об ошибке? В качестве альтернативы, я мог бы прочитать его в виде строки и передать ее в int и распечатать сообщение на основе того, было ли это неудачно или удалось, но как вы используете ошибки ввода типов в программе?
Отформатированный ввод числовых значений преуспевает, есть префикс, который содержит цифры. Потоки не будут легко позволить вам изменить это поведение (вы можете изменить это поведение, используя специализированный std::num_get<char>
но я не буду классифицировать это как простое). Самый простой подход, вероятно, состоит в том, чтобы проверить, является ли следующий символ (если он есть) пробелом (и не использовать fail()
, вы должны просто использовать преобразование в логическое значение):
if (std::cin && (std::isspace(std::cin.peek()) || std::cin.eof())) {
...
}
Кроме того, не сравнивайте логические значения в условиях с true
или false
: результат не становится более логическим, делая это.
int s1
вместоstring
?