Не пройдя весь ваш код.Вероятно, что байты остаются во входном буфере после вызова getline()
.Я объясню с помощью ASCII art.
Скажем, ваш буфер выглядит следующим образом, где каждое пустое поле может содержать байт.
|_|_|_|_|_|...|_|
Когда вы вводите фразу(например, «FOO») и нажмите Enter, буфер выглядит следующим образом:
|F|O|O|\n|_||_|...|_|
Символ '\n'
(символ новой строки) добавляется клавишей Enter.
Когда getline()
читает через буфер, он читает, пока не достигнет символа новой строки, но не удаляет его.Таким образом, вызов выглядит следующим образом:
getline(cin, str) // = "FOO"
|\n|_|_|...|_| // buffer after call
Следующий вызов getline()
будет читать в новой строке (и удалять его из буфера).
getline(cin, str) // = "\n"
|_|_|_|_|_|...|_| // buffer after call
Это поведение привелок обычной практике «очистки буфера» после чтения из входного буфера.Это можно сделать, выполнив
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
после каждого чтения буфера.Это также помогает определить это как макрос или встроенную функцию, чтобы быстро вызывать ее в любое время.