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

如何检测通过read系统调用读取的字符是否为退格键(backspace)

检测退格键与实现删除功能的方案

前置注意事项

默认Linux/Unix终端工作在**规范模式(canonical mode)**下,退格键会被终端直接处理,用来删除行缓冲内的字符,不会通过read调用传递到用户程序。要捕获退格键,需要先将终端切换为非规范模式。


1. 退格键检测方法

通常终端输入的退格键对应两种ASCII值:

  • 常规退格:'\b'(ASCII码0x08)
  • 部分终端的DEL退格:0x7F
    检测逻辑直接判断读入的字符是否匹配这两个值即可:
if (character == '\b' || character == 0x7F) {
    // 是退格键,执行删除逻辑
}

2. 终端模式切换代码示例

需要用<termios.h>头文件的接口修改终端属性,程序退出前要恢复原有属性避免终端异常:

#include <unistd.h>
#include <termios.h>

struct termios old_term, new_term;

// 初始化终端为非规范模式
tcgetattr(STDIN_FILENO, &old_term);
new_term = old_term;
// 关闭规范模式和默认回显,自行控制输出逻辑更稳定
new_term.c_lflag &= ~(ICANON | ECHO);
tcsetattr(STDIN_FILENO, TCSANOW, &new_term);

// 字符读取逻辑
char character;
read(STDIN_FILENO, &character, 1);

// 程序退出前必须恢复终端原有配置
tcsetattr(STDIN_FILENO, TCSANOW, &old_term);

3. 控制台最后一个字符删除实现

要在视觉上删除已输出的最后一个字符,按如下逻辑输出3个字符即可:

  1. 输出'\b'将光标左移一位到待删除字符位置
  2. 输出空格' '覆盖原有字符
  3. 再输出'\b'将光标移回新的内容末尾位置
    代码示例:
if (character == '\b' || character == 0x7F) {
    // 建议先判断输入缓冲区长度,避免删除提示符等不属于当前输入的内容
    write(STDOUT_FILENO, "\b \b", 3);
    // 同步更新你自己维护的输入缓冲区,删掉最后一个存储的字符
} else {
    // 普通字符正常回显
    write(STDOUT_FILENO, &character, 1);
}

内容的提问来源于stack exchange,提问作者Adam Lee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 04:09:02