1

我为程序编写了一个 getch 函数。我不能使用诅咒,因为它破坏了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我知道使用而不是系统调用会更好。一切正常,除了 if ESC key。我正在尝试捕获例如字符串的箭头"\1B[A"。当我检测到ESC第一个字符时,我还阅读了后两个以获取完整的密钥代码。问题是当我按下它时它不应该发生,ESC因为它的代码是 1B 单独的。cin.get()应该在return EOF读取期间缓冲区为空时,但它只是停止。

有没有办法在不使用诅咒的情况下读取ESC密钥?linux为什么我的解决方案不起作用?

谢谢

4

1 回答 1

1

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

这是代码: github上的readkey

于 2013-12-09T16:00:05.243 回答