getline () пропускает первый даже после clear()

поэтому у меня есть функция, которая продолжает пропускать первую getline и прямо ко второй. Я пытался очистить буфер, но все равно не повезло, что происходит?

void getData(char* strA, char* strB)
{
    cout << "Enter String 1: ";               // Shows this line
    cin.clear();
    cin.getline(strA, 50);                    // 50 is the character limit, Skipping Input

    cout << endl << "Enter String 2: ";       // Showing This Line
    cin.clear();
    cin.getline(strB, 50);                   // Jumps Straight to this line
}

4 ответов


убедитесь, что вы не используете cin >> str. перед вызовом функции. Если вы используете cin >> str а затем хотите использовать getline(cin, str), вам необходимо позвонить cin.ignore() раньше.

string str;
cin >> str;
cin.ignore(); // ignores \n that cin >> str has lefted (if user pressed enter key)
getline(cin, str);

в случае использования C-строки:

char buff[50];
cin.get(buff, 50, ' ');
cin.ignore();
cin.getline(buff, 50);

добавить: ваша ошибка, вероятно, не в самой функции, а скорее до вызов функции. Поток cin должны читать только новый символ строки \n' в первом cin.getline.


cin.clear(); очищает любые биты ошибок в потоке-он не потребляет никаких данных, которые могут быть отложены.

вы хотите использовать cin.ignore() для получения данных из потока.


после того, как вы что-то прочитали, все еще есть символ "возврата" внутри bufor, поэтому вам нужно cin.ignore() после каждого прочтения.

вы также можете использовать cin.sync() очистить поток. Метод Actualy clear очищает только флаги.

есть также вариант, что вы можете перейти к концу потока, с ничего не осталось читать вы должны писать без проблем.

std::cin.seekg(0, std::ios::end);

Это зависит от вас, что вы будете использовать.


использовать cin.ignore(-1);Он не удалит первый символ входной строки