gpt4 book ai didi

C 使用 termios 检测箭头键效果不佳

转载 作者:太空宇宙 更新时间:2023-11-04 03:50:57 29 4
gpt4 key购买 nike

我遇到的问题是,当您按下箭头键时,您检测到 3 个输入并且 while 循环执行了 3 次,实际上字符串 PRINT OF DEBUG 的打印发生了 3 次。为什么?我希望当您按下箭头键时,循环会执行 1 次。我该怎么做?这里的代码:

#include <termios.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>

#define KEYCODE_R 0x43
#define KEYCODE_L 0x44
#define KEYCODE_U 0x41
#define KEYCODE_D 0x42

int main()
{
int c;
printf("\nPRESS A ARROW\n");
while(1)
{
c = getch();
printf("\nPRINT OF DEBUG\n");
switch(c)
{
case KEYCODE_L: //rilevazione pressione freccia sinistra
printf("\nLEFT\n");
break;
case KEYCODE_R:
printf("\nRIGHT\n");
break;
case KEYCODE_U:
printf("\nFORWARD\n");
break;
case KEYCODE_D:
printf("\nINDIETRO\n");
break;
}
}
return 0;
}

int getch()
{
char c;
struct termios before,after;
tcgetattr (STDIN_FILENO, &before);//STDIN_FILENO e' il File Descriptor dello stdin. Salviamo in before la configurazione attuale dello stdin
memcpy(&after, &before, sizeof(struct termios));
after.c_lflag &=~ (ICANON | ECHO); //modifichiamo la configurazione dello stadin modificando il flag c_lflag con degli or e and bit a bit
after.c_cc[VMIN] = 1;
after.c_cc[VTIME] = 0;
tcsetattr (STDIN_FILENO, TCSANOW, &after); //qui effettuiamo effettivamente le modifiche

if (read (STDIN_FILENO, &c, sizeof(char)) == -1) //read e' una system call, leggiamo dallo stdin
{
perror("\nErrore in lettura\nIl programma termina");
tcsetattr (STDIN_FILENO, TCSANOW, &before);
exit(-1);
}

tcsetattr (STDIN_FILENO, TCSANOW, &before); //si ripristina la configurazione dello stdin
return c;
}

感谢您的关注

最佳答案

getch 最终会得到三个十六进制代码:0x1B 0x5B 和 [0x41、0x42、0x43 或 0x44]。当它获得 0x1B(转义字符)时,switch 语句不执行任何操作。 0x5B 也一样。

最后得到的字符是您正在处理的字符。如果您想查看某些内容,请将默认值添加到您的 switch 语句中。添加默认值会让您知道您正在获取整个转义序列。 (你真的应该以不同的方式处理输入,除非你绝对确定用户只会按下箭头键。)

关于C 使用 termios 检测箭头键效果不佳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20583824/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com