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 на ноль в случае неверного ввода?