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.