如何在获得下一个字符后正确刷新输入缓冲区,而无需按两次回车键!C++

How do I flush the input buffer correctly after I get the next char without having to press enter twice! C++

本文关键字:缓冲区 按两次 C++ 回车 输入 刷新 下一个 字符      更新时间:2023-10-16

请考虑以下代码:

#include <iostream>
using namespace std;
int main()
{
    char input;
    while (1) {
        cout << "Enter: ";
        cin.get(input);
        cin.ignore(100, 'n'); //requires another `enter`
    }
    return 0;
}

我想获取输入缓冲区中的下一个字符,并希望之后清除该输入缓冲区。我知道我们可以使用cin.ignore()进行清洁,但是,如果我使用它,那么我必须按两次回车键(如果单独输入enter(才能输入我的输入!我怎样才能防止这种情况发生?

#include <iostream>
using namespace std;
int main()
{
    char input;
    while (1)
    {
        cout << "Enter: ";
        cin.get(input);
        cout << input << endl;
        cin.ignore(255, 'n');
        cin.clear();
    }
    return 0;
}

您需要清除 CIN 标志: cin.clear((;

在这种情况下,解决方法可能是使用 std::stringstd::getline

#include <iostream>
#include <string>
int main()
{
    while(true)
    {
        std::cout << "Enter: " << std::flush;
        std::string input;
        if(std::getline(std::cin, input) && !input.empty())
        {
            input.front(); // this is your character
        }
    }
    return 0;
}

std::cin.ignore()将阻塞,直到它读取count字符或看到其delimiter。 在调用输入函数之前,没有可靠的方法来检查std::cin是否会阻塞。 防止它在input == 'n'时阻塞的唯一可靠方法是在调用ignore()之前检查该条件。

#include <iostream>
#include <limits>
int main()
{
    char input;
    while (true) {
        std::cout << "Enter: ";
        std::cin.get(input);
        if (input != 'n') {
            // Note: using std::numeric_limits<std::streamsize>::max()
            // disables std::istream::ignore's count check entirely
            std::cin.ignore(std::numeric_limits<std::streamsize>::max(), 'n');
        }
    }
}