Допустим, ваш вклад, как это:
2\n
line 0\n
line 1\n
Затем после cin>>test
, есть пустая строка в верхней части:
\n
line 0\n
line 1\n
Использование >>
только считывает бит это (т. е. int
), затем оставляет что-то еще на потоке (в данном случае только \n
, но подумайте об этом, re могут быть всевозможными вещами на линии). getline
читает все до \n
затем удаляет \n
из потока. Таким образом, после первого getline
, оставшийся вход:
line 0\n
line 1\n
и cases[0]
содержит ""
(т.е. пустая строка).
Затем после следующего getline
:
remaining input:
line 1\n
и
cases[0]: ""
cases[1]: "line 0"
Затем цикл останавливается, потому что он прочитал 2 строки. Вот что случилось. Фиксирование это другое дело. Я предпочитаю просто избегать смешивания >>
и getline
. Но вы можете сделать что-то, чтобы очистить этот трейлинг \n
от потока.
EDIT: Вы также можете сделать так, чтобы читать на std::vector (что документация может быть немного техническими - найти учебники) и пороки using namespace std;
я соединял один из способов ее фиксации. Примечание stoi
- только C++ 11. Если у вас этого нет, вы можете попробовать stringstream
с >>
или atoi
.
#include <iostream>
#include <vector>
#include <string>
int main()
{
int inLines = 0;
//std::cin >> inLines;
std::string countLine;
std::getline(std::cin, countLine);
try
{
inLines = std::stoi(countLine);
}
catch (...)
{
std::cout << "First line must be an integer\n";
return 1;
}
std::vector<std::string> lines(inLines);
for (int i = 0; i < inLines; ++i)
{
std::getline(std::cin, lines[i]);
}
for (auto & s : lines)
{
std::cout << s << '\n';
}
return 0;
}
дать образец вывода, объясняя, что не так – uba
Это комбинация '>>' и 'getline'. Остальная часть строки (на самом деле, вероятно, ничего не содержит) после ввода 'int' для размера считывается в' cases [0] '. Я всегда считаю, что проще всего не смешивать использование '>>' и 'getline'. – BoBTFish