Неожиданное поведение функции getline

0

У меня есть этот цикл в моей программе, который читает номер телефона в виде строки:

while (loop) {
    cout << "Telefone (0 para sair):" << endl;
    string phone;
    getline(cin, phone);

    // .. some logic
    while (loop2) {
        // .. more logic
        getline(cin, option);
        // .. more logic
    }
}

когда цикл завершает логику и возвращается к началу, он не запрашивает телефон снова. Он снова проходит логику. Есть идеи?

Если бы я использовал cin >> phone вместо этого, он не улавливает номера телефонов с пробелами.

  • 0
    Включает ли эта не показанная логика cin >> something ?
  • 0
    Пожалуйста, проведите день или три на этом сайте в поисках похожих проблем; этот вопрос обсуждался тысячи раз.
Показать ещё 16 комментариев
Теги:

2 ответа

2
Лучший ответ

Ваше утверждение о том, что следующий цикл не требует ввода phone очень показательно, что std::getline() не удалось создать символы из-за ведущих пробелов. Мое подозрение в том, что вы выполнили отформатированное извлечение в своем реальном коде, оставив в потоке новую строку. Неформатированный экстрактор std::getline() ограничивает ввод при приобретении символа новой строки, что является причиной того, что вы испытываете такое поведение.

Неизбежно, решение этой проблемы является ясным ведущим пробелом. Это делается с помощью манипулятора std::ws:

std::getline(std::cin >> std::ws, phone);
//           ^^^^^^^^^^^^^^^^^^^

Примечание: Я говорю об этом подробно в моем ответе здесь.

Вы также должны проверить, был ли ваш вход успешным. Это означает включение извлечения в оператор if чтобы вы могли убедиться, что он успешно создал символы:

if (std::getline(std::cin >> std::ws, phone))
{
    // ...
}
0

Возможно, вам нужно использовать cin.clear() или cin.ignore(), прежде чем пытаться ввести снова.

Больше объяснений:

Это только по моему опыту, но в соответствии с jrok в этом потоке: getline() не работает, если используется после некоторых входов

"Операции извлечения оставляют конечный символ"\n "в потоке. С другой стороны, istream :: getline() отбрасывает его. Поэтому, когда вы вызываете getline после оператора извлечения,"\n "- это первый символ, с которым он сталкивается и он прекращает чтение прямо там. Положите это перед извлечением вызова getline: cin.ignore() "

  • 0
    Возможно, вы можете объяснить, почему?
  • 0
    Это только из моего опыта, но в соответствии с jrok в этом потоке: stackoverflow.com/questions/12691316/… "Операции извлечения оставляют завершающий символ '\ n' в потоке. С другой стороны, istream :: getline ( ) отбрасывает его. Поэтому, когда вы вызываете getline после оператора извлечения, '\ n' является первым встречаемым символом, и он тут же прекращает чтение. Поместите это после перед извлечением вызова getline: cin.ignore () "
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню