如何在获得下一个字符后正确刷新输入缓冲区,而无需按两次回车键!C++
How do I flush the input buffer correctly after I get the next char without having to press enter twice! C++
请考虑以下代码:
#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::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;
}
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');
}
}
}
相关文章:
- g++的分段错误(在NaN上使用to_string两次时)
- 蛇在C++不会连续转两次
- 检查一个数组是否包含在另一个数组中,以相反的顺序,至少两次
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- 我应该如何去缓解两次出现的cin?
- Realloc 两次无法在 Visual Studio 上运行
- 使用 getline(cin, var) 两次在进行字符串比较时会产生错误 (==)
- 为什么映射插入和 map.find() 的单次迭代比插入和 map.find() 的两次单独迭代慢得多
- C++析构函数调用两次,堆栈分配的复合对象
- 为什么参数在构造 std::thread 时移动两次
- 绘制一个对象,比较模具缓冲区的两个不同值
- 必须使用 cin.getline() 按回车键两次
- 如果参数传递两次,会发生什么情况?一次按值,一次按引用?是否会修改
- 为什么我必须在C++中按两次回车键才能获得行
- 为什么我必须按enter两次
- 如何在获得下一个字符后正确刷新输入缓冲区,而无需按两次回车键!C++
- C++的上线后必须按两次"Enter"?
- 从输入中读取单词序列。使用"Quit"终止,按输入顺序打印,不要打印两次单词。
- 带有线程的c++主程序需要按Ctrl+C两次才能退出
- 复制构造函数——用相同的变量按值调用函数两次会导致问题