我正在用c / c ++实现一个关键的读者程序。我正在使用linux。我知道无缓冲的getchar函数将返回很少的键数据值。对于所有ASCII键(a-z,A-Z,1-9,标点符号,输入,制表符和ESC),将从getchar()返回单个值。对于其他键,例如箭头键,会有ESC键读取,但是当再次调用getchar()时,它将获得另一个值(A,B,C或D)。
A = 65
B = 66
向上箭头= 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;
}
答案 0 :(得分:0)
您可以在逃脱时标记stdio非阻塞,然后尽可能多地阅读。 您需要包含&lt; fcntl.h&gt;
if (ch[0] == 27) {
int flags = fcntl(STDIN_FILENO, F_GETFL, 0);
fcntl(STDIN_FILENO, F_SETFL, flags | O_NONBLOCK);
for (;;) {
int c = getchar();
if (c == EOF)
break;
printf("%u ", c);
}
fcntl(STDIN_FILENO, F_SETFL, flags);
puts("\n");
}
两个键之后仍然存在问题,因为循环将会读取,直到没有更多数据可用。
答案 1 :(得分:0)
获得第一个ESC字符后,您可以在不等待的情况下读取其他字符(例如通过在termios结构中设置c_cc [VMIN] = 0和c_cc [VTIME] = 0),然后如果找到的字符与功能键模式,您将已读取的字符插入缓冲区以进行回读。然后,在下一次获取时,首先返回缓冲的字符,如果有的话。
答案 2 :(得分:-1)
在循环中添加getchar(),当输入的密钥为ENTER时退出循环。 例如:
char ch[5];
int i=0;
while(1)
{
ch[i] = getchar();
if('\n'==ch[i])
{
break;
}
i++;
if(i==5)
{
break;
}
}