Getline переходит на следующий cin и пропускает предыдущий cin

Я пытаюсь использовать getline(), но после ввода курсора 1-й записи не ждите 2-го названия страны, оно пропускается и переходит на название столицы. Где моя ошибка. Если я войду

Страна: Индия
Столица:Дели
Столица: 57382
он принимает это значение без каких-либо проблем, но курсор не ждет следующей страны, он сразу переходит на столицу после ввода значения на душу населения.

#include<iostream.h>
#include<conio.h>
#include <string.h>
struct country
{
char nm[30];
char capital[30];
float income;
};

void main()
{
  country c[5];
  clrscr();
  for( int i=0; i<5 ; i++)
  {
    cout << "\n Country's name : ";
    cin.getline(c[i].nm, 30);
    cout << "\n Country's capital :";
    cin.getline(c[i].capital,30);
    system("cls");
    cout << "\n Per capita income :";
    cin >> c[i].income;
  }

Я изменил код, добавив cin.ignore();

  for( int i=0; i<5 ; i++)
  {
    cout << "\n Country's name : ";
    cin.getline(c[i].nm, 30);
    cin.ignore();
    cout << "\n Country's capital :";
    cin.getline(c[i].capital,30);
    cin.ignore();
    cout << "\n Per capita income :";
    cin >> c[i].income;
    cin.ignore();
  }

Но после этого getline() ожидает следующую страну, но теперь она ожидает после каждого ввода страны, столицы и капитала. Значит я вхожу

Страна:Индия //Нажмите ввод //ожидание, и я нажала ввод здесь
Capital:Delhi //Нажмите ввод //ожидание, и я нажала ввод здесь
Capita: 32323 //Нажмите ввод //ожидание, я нажал ввод здесь

То же самое 5 раз.


person Vishal    schedule 28.02.2014    source источник


Ответы (1)


Поскольку cin >> не использует символы конца строки, следующие за введенным вами числом. Эти символы остаются во входном буфере. При следующем вызове getline() он находит новую строку и предполагает, что пользователь ввел пустую строку, просто нажав клавишу ввода.

person TypeIA    schedule 28.02.2014
comment
Я догадался об этой проблеме и добавил cin.ignore(), но теперь возникает другая проблема, пожалуйста, посмотрите отредактированный пост - person Vishal; 28.02.2014
comment
@Vishal Вы потеряли звонок ignore(). Должен быть только один, и он должен быть непосредственно перед первым вызовом getline(). Кроме того, лучше сделать std::cin >> std::ws вместо ignore(), так как вы только пытаетесь отбросить пробелы. - person 0x499602D2; 28.02.2014