Шаблон ввода выглядит как
t
quote
quote
quote
...
Чтение t
cin>>t;
останавливается, как только находит вход, который не может быть целым числом. Это включает символ новой строки, представляющий конец строки, оставляя символ новой строки в потоке для последующего использования (см. Почему std :: getline () пропускает ввод после форматированного извлечения? для получения дополнительной информации об этом проблема). Проблема пропуска была решена с помощью
cin.ignore();
getline(cin,quote);
в цикле while
, но это обменивало одну ошибку на другую. Если не было предшествующего форматированного ввода, чтобы оставить нежелательные символы в потоке, cin.ignore();
будет выбрасывать допустимый первый символ ввода.
Это произойдет во втором и последующих чтениях. Вход будет выглядеть как
t //newline consumed by ignore
quote //newline consumed by getline. ignore consumes first character of next line
uote //newline consumed by getline. ignore consumes first character of next line
uote //newline consumed by getline. ignore consumes first character of next line
..
Решение:
Переместить его после ввода, которое оставляет нежелательный символ в потоке
cin>>t;
cin.ignore();
Лучшая альтернатива - ignore
, так что вы можете быть уверены, что избавились от всего потенциального мусора в конце строки
cin>>t;
cin.ignore(numeric_limits<streamsize>::max(), '\n');
Это будет считывать из потока до максимально возможной длины потока, или будет найдена и отброшена новая строка, в зависимости от того, что произойдет раньше.
Всегда убирайте после операции, а не до следующей. Он сближает связанный код, способствует удобочитаемости и защищает вас от случаев, когда нет ничего, что нужно было бы очистить.