我为程序编写了getch函数。我无法使用curses,因为它破坏了我已经使用的iostream的终端。代码:

inline std::string getch() {
    char inp[4];
    system("stty raw");
    inp[0] = std::cin.get();
    if(inp[0] == 27 && (inp[1] = std::cin.get()) != std::char_traits<char>::eof()) {
        std::cin>>inp[2];
        inp[3] = '\0';
    }
    else {
        inp[1] = '\0';
    }
    system("stty cooked echo");
    return std::string(inp);
}

我知道最好使用termios.h而不是系统调用。一切正常,除非ESC key。我正在尝试捕获例如"\1B[A"的字符串的箭头。当我检测到ESC作为第一个字符时,我还阅读了后两个字符以获得完整的键控代码。
问题是,当我按ESC时,它不应该发生,因为它的代码仅为1B。当读取期间缓冲区为空时,cin.get()应该为return EOF,但是它只是停止了。

有没有办法在不使用curses的情况下读取ESC上的linux键?为什么我的解决方案不起作用?

谢谢

最佳答案

经过数小时的搜索,我找到了解决方案。我不得不使用unistd.h的读取功能
它用输入的字符填充给定大小的数组。当按下一个键时,缓冲区中将充满所有读取的字符(也可以在多个键上使用)。因此,ESC仅具有{27,0,0,...,0}和箭头{27,'[','A',0,0,...,0}。
我已经使用termios.h重写了函数并将其放入库中,因此任何人都可以受益。

这是代码:
readkey on github

09-10 07:34
查看更多