2015-09-17 4 views
1
int main() 
{ 
int n; 
cin>>n; 
string str1[n]; 
for(int i=0;i<n;i++) 
    getline(cin,str1[i]); 
return 0; 
} 

Я написал код для ввода n строк, но код принимает только (n-1) строки в качестве входных данных. В чем причина этого?Функция getline() в C++ принимает 1 меньше ввода

+0

Связанный с этим вопрос содержит исправление. Связанный с этим вопрос: http://stackoverflow.com/questions/21567291/why-does-stdgetline-skip-input-after-a-formatted-extraction. Исправить: добавить 'std :: cin.ignore (std :: numeric_limits :: max(), '\ n')' после 'cin >> n;'. –

+0

@ Robᵩ спасибо, решил мою проблему. –

+1

[OT] 'string str1 [n];' - массив переменной длины, а не стандартный. Вы можете изменить его на 'std :: vector str1 (n);' – NathanOliver

ответ

4

Цикл for работает для n итераций и getline читает в n строках. Рассмотрим этот вход:

2 
First 
Second 

В этом входе есть три линии (не два!): 2\nFirst\n, и Second\n.

Ваш форматированный вход (cin>>n) читает часть первой строки: 2. Затем цикл работает дважды, считывая следующие данные: \n и First\n. Третья и последняя строка (Second\n) никогда не читаются.

Решение состоит в том, чтобы прочитать \n с первой строки до начала цикла. Это можно сделать разными способами. Вот один из них:

std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n')