Чтобы прочитать строку с пробелами use std::getline
.
Но!
Обратите внимание на то, что происходит с >>
, когда оно попадает в разделитель. Он останавливается и оставляет ограничитель в потоке. Это не проблема, если вы используете только >>
, так как >>
отбросит все пробелы. std::getline
будет захватить этот пробел, и общий UseCase является
user types in number and hits enter
user types in string and hits enter
Так что же происходит? >>
извлекает номер и останавливается, когда он попадает в пробелы. Это оставляет конец строки, помещенной в поток, нажав enter в потоке. std::getline
приходит, и первое, что он видит, это ... конец строки. std::getline
хранит пустую строку и сразу возвращается. Теперь программа обрабатывает пустую строку, и пользователь, все еще ожидая ввода строки, вводит строку, которая будет считываться некоторым будущим чтением, возможно, помещая входной поток в случай ошибки и, конечно же, давая пользователю сюрприз.
Общим решением является to use ignore(numeric_limits<streamsize>::max(), '\n');
, чтобы использовать любые данные, все еще находящиеся в потоке, вплоть до конца строки, прежде чем запрашивать пользователя для ввода и вызова std::getline
.
Почему #include? –
Что вы пробовали? Кроме того, * ПОЧЕМУ * все держат в том числе '' ?? –
DeiDei
<бит/stdC++. H> или любой другой, что угодно –