флаг cin fail для помещения строк в int

0

Мне нужно прочитать 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 и распечатать сообщение на основе того, было ли это неудачно или удалось, но как вы используете ошибки ввода типов в программе?

  • 1
    Разве вы не имеете в виду int s1 вместо string ?
  • 0
    да извини. изменил это сейчас
Теги:
casting
error-handling
cin

1 ответ

1
Лучший ответ

Отформатированный ввод числовых значений преуспевает, есть префикс, который содержит цифры. Потоки не будут легко позволить вам изменить это поведение (вы можете изменить это поведение, используя специализированный std::num_get<char> но я не буду классифицировать это как простое). Самый простой подход, вероятно, состоит в том, чтобы проверить, является ли следующий символ (если он есть) пробелом (и не использовать fail(), вы должны просто использовать преобразование в логическое значение):

if (std::cin && (std::isspace(std::cin.peek()) || std::cin.eof())) {
    ...
}

Кроме того, не сравнивайте логические значения в условиях с true или false: результат не становится более логическим, делая это.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню