如何让getchar()函数读取退格键并返回其ASCII值?
关于getchar()读取退格键ASCII值的问题解答
嘿,作为C编程新手,你的问题问得很实在!咱们来把这个问题掰扯清楚:getchar()确实能读取退格键的ASCII值(也就是8),但默认情况下做不到,得先调整终端的输入模式才行。
为什么你的现有代码不生效?
默认情况下,咱们用的终端是「行缓冲模式」:
- 你输入的所有字符都会先存在终端的缓冲区里,只有按下回车键时,整行内容才会传给程序。
- 而且像退格、删除这类控制键,终端会直接自己处理(比如按下退格就删掉屏幕上的前一个字符),根本不会把对应的ASCII值发送给getchar()。所以你代码里的
if(c==8)分支永远不会被触发。
怎么让getchar()读到退格键?
要解决这个问题,咱们需要把终端切换到「非规范模式」(也叫原始模式),关掉行缓冲和自动回显,这样每一个按键(包括退格)都会直接传给程序。这里要用到<termios.h>头文件里的终端控制函数,下面是给新手写的完整示例代码:
#include <stdio.h> #include <termios.h> #include <unistd.h> int main(void) { int c; struct termios old_attr, new_attr; // 保存当前终端设置,方便程序退出后恢复 tcgetattr(STDIN_FILENO, &old_attr); // 复制当前设置到新结构体,再修改需要的选项 new_attr = old_attr; // 关掉行缓冲(ICANON)和回显(ECHO) new_attr.c_lflag &= ~(ICANON | ECHO); // 设置最小输入字符数为1,超时时间为0(立即读取) new_attr.c_cc[VMIN] = 1; new_attr.c_cc[VTIME] = 0; // 应用新的终端设置 tcsetattr(STDIN_FILENO, TCSANOW, &new_attr); printf("现在可以按退格键测试啦,按Ctrl+C退出程序\n"); while((c = getchar()) != EOF) { if(c == 8) { // 8是退格的ASCII值 printf("读到退格键啦!ASCII值是%d\n", c); // 这里可以加上你想要的退格处理逻辑,比如输出\b来删除屏幕字符 printf("\b"); } else { printf("读到字符:%c(ASCII值%d)\n", c, c); } } // 程序退出前恢复原来的终端设置,不然终端会变得奇怪(比如输入不显示) tcsetattr(STDIN_FILENO, TCSANOW, &old_attr); return 0; }
一些新手要注意的点
- 编译的时候不需要额外链接库,直接用
gcc your_code.c -o test就行。 - 要退出程序的话,按
Ctrl+C(因为EOF在终端里是Ctrl+D,但非规范模式下可能需要用Ctrl+C更直观)。 - 一定要记得恢复终端设置!如果程序意外崩溃没执行到恢复代码,你可以在终端里输入
reset命令来恢复正常。
总结
getchar()本身有能力读取退格键的ASCII值,但受限于终端的默认模式,需要手动修改终端设置才能实现。上面的代码已经帮你处理了所有细节,你可以直接运行测试,也可以根据自己的需求调整逻辑~
内容的提问来源于stack exchange,提问作者Jay Patel
相关产品推荐
相关产品推荐

