如何检测通过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个字符即可:
- 输出
'\b'将光标左移一位到待删除字符位置 - 输出空格
' '覆盖原有字符 - 再输出
'\b'将光标移回新的内容末尾位置
代码示例:
if (character == '\b' || character == 0x7F) { // 建议先判断输入缓冲区长度,避免删除提示符等不属于当前输入的内容 write(STDOUT_FILENO, "\b \b", 3); // 同步更新你自己维护的输入缓冲区,删掉最后一个存储的字符 } else { // 普通字符正常回显 write(STDOUT_FILENO, &character, 1); }
内容的提问来源于stack exchange,提问作者Adam Lee
相关产品推荐
相关产品推荐

