You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:50:56