Getline работает неправильно? Каковы могут быть причины?
Возможный дубликат:
getline не запрашивает вход?
В моей программе происходит нечто уникальное.
Вот несколько команд:
cout << "Enter the full name of student: "; // cin name
getline( cin , fullName );
cout << "\nAge: "; // cin age
int age;
cin >> age ;
cout << "\nFather Name: "; // cin father name
getline( cin , fatherName );
cout << "\nPermanent Address: "; // cin permanent address
getline( cin , permanentAddress );
Когда я пытаюсь запустить этот фрагмент вместе со всем кодом. Выходная программа работает как:
![enter image description here]()
Выход:
Enter the full name of student:
Age: 20
Father Name:
Permanent Address: xyz
Если вы заметили, программа не спросила меня полное имя и продолжила, чтобы спросить меня о возрасте. Затем он также пропустит имя отца и запросит постоянный адрес.
Что может быть причиной этого?
Мне сложно опубликовать весь код, потому что он слишком большой.
Ответы
Ответ 1
Так как вы не отправили никакого кода. Я собираюсь угадать.
Общей проблемой при использовании getline
с cin
является getline
не игнорировать ведущие символы пробела.
Если getline используется после cin >>
, getline()
видит этот символ новой строки как ведущий пробел, и он просто перестает читать дальше.
Как его решить?
Вызов cin.ignore()
перед вызовом getline()
Или
сделать фиктивный вызов getline()
для использования символа конечной новой строки из cin >>
Ответ 2
Проблема заключается в том, что вы смешиваете getline
с входом cin >>
.
Когда вы выполняете cin >> age;
, который получает возраст от входного потока, но он оставляет пробелы в потоке. В частности, он оставит новую строку на входном потоке, который затем будет прочитан следующим вызовом getline
как пустая строка.
Решение должно использовать только getline
для ввода ввода, а затем разбор строки для необходимой вам информации.
Или, чтобы исправить свой код, вы можете сделать следующее, например. (вам все равно придется добавлять код проверки ошибок самостоятельно):
cout << "Enter the full name of student: "; // cin name
getline( cin , fullName );
cout << "\nAge: "; // cin age
int age;
{
std::string line;
getline(cin, line);
std::istringstream ss(line);
ss >> age;
}
cout << "\nFather Name: "; // cin father name
getline( cin , fatherName );
cout << "\nPermanent Address: "; // cin permanent address
getline( cin , permanentAddress );
Ответ 3
после строки cin >> age ;
по-прежнему остается символ новой строки \n
(потому что вы нажали enter для ввода значения) в буфере ввода, чтобы исправить это, вы добавили строку с cin.ignore();
после прочтения int.