C++ 使用<;编写我自己的kbhit版本;ncurses.h>;对于linux

C++ 使用<;编写我自己的kbhit版本;ncurses.h>;对于linux,c++,ncurses,C++,Ncurses,由于ncurses没有kbhit,我找到了上面的函数。但是他们把控制台弄坏了。这就是我尝试打印以下内容时发生的情况: 请看图片,这就是所谓的“楼梯” kbhit的示例启动诅咒,但不退出诅咒(使用endwin)。如果您的程序尝试使用非诅咒调用,如printf,则终端仍将处于原始模式,并且在退出shell后将保持原始模式(除非有什么东西重置了终端)。您的问题是什么?如何修复?它不应该是这样输出的?您不需要ncurses来实现kbhit()。它只是在FD0上的select(),超时时间为零。然而,将其

由于ncurses没有kbhit,我找到了上面的函数。但是他们把控制台弄坏了。这就是我尝试打印以下内容时发生的情况: 请看图片,这就是所谓的“楼梯”


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;
    }
}