C++ 使用<;编写我自己的kbhit版本;ncurses.h>;对于linux
由于ncurses没有kbhit,我找到了上面的函数。但是他们把控制台弄坏了。这就是我尝试打印以下内容时发生的情况: 请看图片,这就是所谓的“楼梯”C++ 使用<;编写我自己的kbhit版本;ncurses.h>;对于linux,c++,ncurses,C++,Ncurses,由于ncurses没有kbhit,我找到了上面的函数。但是他们把控制台弄坏了。这就是我尝试打印以下内容时发生的情况: 请看图片,这就是所谓的“楼梯” kbhit的示例启动诅咒,但不退出诅咒(使用endwin)。如果您的程序尝试使用非诅咒调用,如printf,则终端仍将处于原始模式,并且在退出shell后将保持原始模式(除非有什么东西重置了终端)。您的问题是什么?如何修复?它不应该是这样输出的?您不需要ncurses来实现kbhit()。它只是在FD0上的select(),超时时间为零。然而,将其
kbhit
的示例启动诅咒,但不退出诅咒(使用endwin
)。如果您的程序尝试使用非诅咒调用,如printf
,则终端仍将处于原始模式,并且在退出shell后将保持原始模式(除非有什么东西重置了终端)。您的问题是什么?如何修复?它不应该是这样输出的?您不需要ncurses来实现kbhit()
。它只是在FD0上的select()
,超时时间为零。然而,将其与缓冲输入(如cin
)混合不太可能很好地工作。哦,忘记了您确实需要将终端置于原始非规范模式下才能工作,请参见例如,听起来他在使用printf
。这是行不通的(因为诅咒将屏幕置于原始模式…),但示例代码不完整,只允许猜测。
bool kbhit(void)
{
// function without the 4 lines of code below will not work
// but they also screw up the console
initscr();
cbreak();
noecho();
nodelay(stdscr, TRUE);
scrollok(stdscr, TRUE);
int ch = getch();
if (ch != ERR) {
ungetch(ch);
refresh();
return true;
} else {
refresh();
return false;
}
}