При чтении из std :: cin предпочтительно не использовать оператор извлечения потока >>
, поскольку это может иметь всевозможные неприятные побочные эффекты.Например, если у вас есть этот код:
std::string name;
std::cin >> name;
И я ввожу John Doe
, тогда строка для чтения из cin
будет просто содержать значение John
, оставляя Doe
позади, чтобы бытьчитать с помощью будущей операции чтения.Точно так же, если бы я должен был написать:
int myInteger;
std::cin >> myInteger;
И тогда я наберу John Doe
, тогда cin
войдет в состояние ошибки и откажется выполнять любые будущие операции чтения, пока вы явно не очистите ее ошибкуукажите и очистите символы, вызвавшие ошибку.
Лучший способ ввода данных пользователем - использовать std :: getline для чтения символов с клавиатуры, пока пользователь не нажмет ввод.Например:
std::string name;
getline(std::cin, name); // getline doesn't need the std:: prefix here because C++ has ADL.
ADL обозначает поиск, зависящий от аргумента.Теперь, если я введу John Doe
, значение name
будет John Doe
, и в cin
не останется никаких данных.Кроме того, это также позволяет вам проверить, нажал ли пользователь только клавишу ввода:
std::string name;
getline(std::cin, name);
if (name.empty()) {
/* ... nothing entered ... */
}
Недостаток использования этого подхода заключается в том, что если вы хотите читать в отформатированной строке данных, то int
или double
вам придется разобрать представление вне строки.Лично я думаю, что это того стоит, потому что это дает вам более детальный контроль над тем, что делать, если пользователь вводит что-то недопустимое и «защищает» cin
от перехода в состояние сбоя.
Я учуКурс по программированию на C ++ и некоторых лекционных заметок о библиотеке потоков , в которых подробно рассказывается о том, как безопасно читать отформатированные данные из cin
(в основном в конце главы),Я не уверен, насколько это полезно, но в случае, если это будет полезно, я решил опубликовать ссылку.
Надеюсь, это поможет!