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

时间:2016-02-02 07:55:58

标签: c++ cin

请考虑以下代码:

#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 )输入我的输入!我该如何防止这种情况发生?

3 个答案:

答案 0 :(得分:1)

#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();

答案 1 :(得分:1)

此案例中的解决方法可能是使用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;
}

答案 2 :(得分: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');
        }
    }
}