请考虑以下代码:
#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
)输入我的输入!我该如何防止这种情况发生?
答案 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::string
和std::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');
}
}
}