У меня есть этот цикл в моей программе, который читает номер телефона в виде строки:
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
вместо этого, он не улавливает номера телефонов с пробелами.
Ваше утверждение о том, что следующий цикл не требует ввода phone
очень показательно, что std::getline()
не удалось создать символы из-за ведущих пробелов. Мое подозрение в том, что вы выполнили отформатированное извлечение в своем реальном коде, оставив в потоке новую строку. Неформатированный экстрактор std::getline()
ограничивает ввод при приобретении символа новой строки, что является причиной того, что вы испытываете такое поведение.
Неизбежно, решение этой проблемы является ясным ведущим пробелом. Это делается с помощью манипулятора std::ws
:
std::getline(std::cin >> std::ws, phone);
// ^^^^^^^^^^^^^^^^^^^
Примечание: Я говорю об этом подробно в моем ответе здесь.
Вы также должны проверить, был ли ваш вход успешным. Это означает включение извлечения в оператор if
чтобы вы могли убедиться, что он успешно создал символы:
if (std::getline(std::cin >> std::ws, phone))
{
// ...
}
Возможно, вам нужно использовать cin.clear() или cin.ignore(), прежде чем пытаться ввести снова.
Больше объяснений:
Это только по моему опыту, но в соответствии с jrok в этом потоке: getline() не работает, если используется после некоторых входов
"Операции извлечения оставляют конечный символ"\n "в потоке. С другой стороны, istream :: getline() отбрасывает его. Поэтому, когда вы вызываете getline после оператора извлечения,"\n "- это первый символ, с которым он сталкивается и он прекращает чтение прямо там. Положите это перед извлечением вызова getline: cin.ignore() "
cin >> something
?