Причина, по которой он это делает, заключается в том, что когда вы вызываете getline()
, он берет то, что находится в cin
, и помещает его в переменную. Однако, когда вы изначально вызывали cin
для получения начального ввода, символ новой строки оставался в буфере после перехода в вашу функцию make()
.
Поэтому, когда вы входите в цикл, первый getline()
берет '\n'
из cin
, и буфер очищается. Вот почему он, кажется, «пропускает» первую итерацию, как кажется.
Таким образом, чтобы заставить его работать правильно, вы должны очистить входной буфер при вызове вашей функции, используя cin.ignore()
, например:
void make(int n)
{
cin.ignore(1000,'\n'); //ignores 1000 characters or until sees \n
std::string user_input;
std::istringstream iss(user_input);
char letter;
int index;
while(n>0)
{ cout<<n<<endl;
std::getline(std::cin, user_input);
while (iss >> letter >> index)
cout<<letter<<' '<<index;
n--;
}
}
int main()
{ int n;
cin>>n;
make(n);
return 0;
}
В последнее время я не очень часто использовал c ++, поэтому в настоящий момент я не уверен, есть ли лучший способ справиться с этим, но это должно дать вам хорошее направление.