我正在c/C++中实现一个密钥阅读器程序。我正在使用Linux。我知道,无缓冲的getchar函数将返回键的很少的数据值。对于所有ASCII键(a-z,A-Z,1-9,标点符号,输入,制表符和ESC),将会有一个从getchar()返回的值。对于其他键(如箭头键),将会读取ESC键,但是当再次调用getchar()时,它会得到另一个值(A,B,C或D)。C++ getchar()是否有数据仍在等待读取
A = 65
B = 66
UP箭头= 27 91 65
F5 = 27 91 49 53 126
ESC = 27
全表here
有什么方法可以检查是否有更多要读取的字符还是只有一个字符?当一个键被读取并且它的第一个值是ESC时,我不知道它是否是一个以ESC开头的功能键,或者它只是ESC键。
#include <stdlib.h>
#include <stdio.h>
#include <sys/ioctl.h>
#include <iostream>
#include <string>
#include <termios.h>
#include <unistd.h>
using namespace std;
int main(int argc, char *argv[]) {
int ch[5];
int i;
struct termios term;
tcgetattr(STDIN_FILENO, &term);
term.c_lflag &= ~(ICANON | ECHO);
tcsetattr(STDIN_FILENO, TCSANOW, &term);
ch[0] = getchar();
// If ch[0] = 27 and there is more data in the buffer
// printf("You pressed a function key");
// Else
// printf("You pressed ESC");
return 0;
}
你的目标是什么操作系统? – paddy
尝试在stdin上使用read并将stdin的属性设置为非块。读直到它返回一个大小为0. – bikram990
如果您输入的字符超出了ASCII字符集中的内容 - 例如功能键或带有其他键的控制键 - 返回值通常没有意义。这些键在ANSI C定义之外,因此,在处理这些键和/或键组合时,getchar()的行为取决于系统。 –