Почему нужно дважды набирать getline (cin, string)?

нужна ваша помощь в получении пользовательского ввода.
Я хочу, чтобы пользователи печатали строку с пробелами.
я не могу использовать cin>>variable поскольку промежуток между ними делает проблему ошибочной.
если я использую getline(cin,string_variable) это работает правильно. но мне нужно напечатать дважды, чтобы заставить его работать неоправданно.

cout<<"Enter movie name";
getline(cin, mvName);
getline(cin, mvName);

Есть ли лучший способ получить пользовательский ввод, чем этот, или есть какие-то другие коды для ввода, а не дважды вводить getline? Просьба совета.

2

Решение

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

if (std::getline(std::cin >> std::ws, mvName)) {
process(mvName);
}

Кстати, вы всегда должны проверять, что ваш вклад был успешным.

6

Другие решения

У меня не было проблем с использованием:

char mvName[32];

cin.getline(mvName, 32);

И мне нужно было позвонить только один раз, снова без проблем.

2

Может быть, вы просто забыли добавить \n в вашем быстром сообщении:

cout<<"Enter movie name:\n";

Но если вы хотите пропустить пустые строки — сделайте это:

// skip empty lines
while (cin >> mvName && mvName.empty());
// here mvName contains non empty string or it is empty because of error in reading
....
1

Поскольку вопрос не содержит символа новой строки, я подозреваю, что вы нажали клавишу Enter, чтобы перейти от "Enter movie name" вопрос? Это поместит пустую строку в stdin, который первым getline() будет читать, а затем второй getline() прочитал бы ваш введенный текст.

Чтобы отменить требование ввода начального символа новой строки, просто добавьте его в строковый литерал вопроса:

std::cout<< "Enter movie name:\n";
1
cout<<"Enter movie name";
getline(cin, mvName);

Работает отлично!

Может быть, вам пришлось использовать getline(cin, mvName); дважды, потому что вы вводили какой-то символ в первый getline(cin, mvName); как пробел, ввод и т. д.

0
По вопросам рекламы [email protected]