#c #conditional-statements #cin #getline
#c #условные операторы #cin #getline
Вопрос:
У меня есть непрерывный while
цикл, внутри которого я получаю пользовательский ввод на неопределенный срок, пока пользователь не пропустит ввод, т.е. Не нажмет enter или не появится EOF (Ctrl D).
При первой попытке я использую getline
функцию.
while (true)
{
if (not (std::getline(std::cin, sm)) or sm.empty())
break;
}
Он работает нормально, завершает цикл без ввода или EOF.
Со второй попытки я использую стандартный cin
:
while (true)
{
if (not (std::cin >> sm) or sm.empty())
break;
}
В этом случае он больше не работает так, как предполагалось. Он не выходит из цикла, когда пользователь нажимает enter, только при вводе EOF он завершается.
В чем разница? Чего мне здесь не хватает?
Любая помощь будет оценена.
Комментарии:
1. Что именно вы подразумеваете под «это больше не работает так, как задумано»?
2. Я имел в виду, что он не выходит из цикла, когда пользователь нажимает enter. Он завершается только при EOF. В отличие от предыдущего случая, когда он завершался как при нажатии enter, так и при нажатии EOF. Я отредактировал свой пост. Извините за путаницу.
3.
std::cin >> sm
пропускает начальные пробелы (включая пустые строки).getline
не работает.std::cin >> sm
считывает токены, разделенные пробелами, и не обрабатывает символы конца строки иначе, чем, скажем, символы пробела. Он никогда не выдаст пустую строку, если не будет обнаружен конец файла или другой сбой.4. Если бы у них было одинаковое поведение, нам не понадобились бы оба из них.