cin перезаписывает мое инициализированное значение, когда оно читает неправильный тип?

Так что это действительно базовый вопрос и супер тривиальный, но я просто изучаю принципы и практики программирования на C++, и моя программа для чтения в виде строки и int ведет себя не так, как книга, написанная Бьярном Страуструпом, так что я удивлюсь, если он сделал ошибку. В любом случае вот код:

#include "..\std_lib_facilities.h"

int main()
{
    cout << "Please enter your first name and age\n";
    string first_name = "???"; // string variable
                               // ("???” means “don’t know the name”)
    int age = -1;              // integer variable (1 means “don’t know the age”)
    cin >> first_name >> age;  // read a string followed by an integer
    cout << "Hello, " << first_name << " (age " << age << ")\n";
}

Когда я вводю "22 Carlos" в терминал по приглашению, он выводит "Hello, 22 (возраст 0)", в основном делая мое значение инициализации для проверки ошибок бесполезным. Это новая особенность с ++ или что-то еще, и поэтому книга не так?

Edit1: Кстати, я использую GCC для Cygwin на Windows 7 и триггер -std= C++11.

2 ответа

Решение

Это новая функция std::basic_istream::operator>>;; начиная с C++11:

Если извлечение завершается неудачно (например, если буква была введена там, где ожидается цифра), значение остается неизменным, и бит сбоя устанавливается. (до C++11)

Если извлечение завершается неудачно, в значение записывается ноль, и бит сбоя устанавливается. (начиная с C++11)

Вместо этого вы должны проверить статус потока, например,

if (cin >> age) {
    ... fine ....
} else {
    ... fails ...
}

Попробуй это:

cin >> first_name >> age;  // read a string followed by an integer

//Check if cin failed.
if (cin.fail())
{
    //Handle the failure
}

Что касается того, почему он устанавливает целое число в 0 при неудаче, посмотрите здесь:

Почему cin, ожидая int, изменяет соответствующую переменную int на ноль в случае неверного ввода?

Другие вопросы по тегам