Разное поведение с getline и cin вместе с условием

#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. Если бы у них было одинаковое поведение, нам не понадобились бы оба из них.