我为程序编写了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