为什么使用ncurses检测按键时else if与switch运行结果不同?
问题原因
你遇到的switch触发多个case的问题是C语言switch语法的默认特性:case穿透。如果每个case分支的结尾没有手动添加break语句,程序匹配到对应case执行完代码后,不会自动退出switch结构,会继续依次执行后续所有case、default分支的代码,直到遇到break或者整个switch执行完毕。
你按下下方向键时,third的值为B,匹配到case('B')后依次往下执行所有分支的打印语句,所以会输出DOWN、RIGHT、UP、LEFT、default的组合,和你实际运行的输出结果完全一致。
修复方案
只需要给每个case分支末尾加break语句即可,修正后代码如下:
char first = getch(); //返回 \033 char second = getch(); //返回 [ char third = getch(); // 返回 A/B/C/D 对应四个方向 switch(third){ case('B'): printf("\nDOWN"); break; case('C'): printf("\nRIGHT"); break; case('A'): printf("\nUP"); break; case('D'): printf("\nLEFT"); break; default: printf("default"); }
额外优化提示
ncurses库本身提供了原生的特殊按键捕获能力,你可以在初始化时调用keypad(stdscr, TRUE)开启功能键捕获,之后直接用getch()返回的KEY_UP、KEY_DOWN、KEY_LEFT、KEY_RIGHT宏判断方向键,不需要手动解析三层转义字符,兼容性和可靠性更高。
内容的提问来源于stack exchange,提问作者Nizar
相关产品推荐
相关产品推荐

