Ubuntu下C语言实现输入时可见、输入完成后清除终端输入内容
解决Ubuntu下C程序输入时可见、输入后清除终端输入内容的问题
你的需求是输入过程中能看到字符,输入完成后终端不保留输入内容,之前的代码直接关闭了回显(ECHO),这会导致输入时看不到字符,显然不符合要求。正确的思路是保持正常回显让用户输入,输入完成后通过终端控制指令清除输入的内容,以下是两种可行的实现方案:
方案一:使用ANSI转义序列清除输入行
ANSI转义序列可以直接控制终端光标移动和内容清除,输入完成后将光标移回输入起始位置,再清除当前行内容即可。
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char input[256]; printf("请输入内容:"); // 正常读取输入,此时输入会正常回显 if (fgets(input, sizeof(input), stdin) == NULL) { perror("读取输入失败"); return 1; } // 去掉输入末尾的换行符(如果存在) input[strcspn(input, "\n")] = '\0'; // 使用ANSI转义序列:先移光标到行首,再清除当前行 // \033[G 光标跳转至当前行开头 // \033[K 清除从光标位置到行尾的所有内容 printf("\033[G\033[K"); // 这里可以添加输入内容的处理逻辑 printf("输入已处理,内容为:%s\n", input); return 0; }
方案二:结合光标位置记录实现精准清除
如果需要更精准地定位输入起始位置,可以先获取输入前的光标坐标,输入完成后返回该位置再清除内容:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> // 获取当前光标所在的行和列坐标 int get_cursor_pos(int *row, int *col) { printf("\033[6n"); // 发送终端指令,请求返回光标位置,格式为 \033[行;列R char buf[32]; int idx = 0; // 读取终端返回的坐标信息 while (read(STDIN_FILENO, &buf[idx], 1) == 1 && idx < sizeof(buf)-1) { if (buf[idx] == 'R') break; idx++; } buf[idx] = '\0'; // 解析出对应的行和列数值 if (sscanf(buf, "\033[%d;%d", row, col) != 2) { return -1; } return 0; } int main() { int start_row, start_col; char input[256]; // 获取输入前的光标位置 if (get_cursor_pos(&start_row, &start_col) != 0) { fprintf(stderr, "无法获取光标位置\n"); return 1; } printf("请输入内容:"); // 正常读取输入,保留回显 if (fgets(input, sizeof(input), stdin) == NULL) { perror("读取输入失败"); return 1; } input[strcspn(input, "\n")] = '\0'; // 跳转回输入起始位置,清除从光标到行尾的内容 printf("\033[%d;%dH\033[K", start_row, start_col); printf("处理完成,输入内容:%s\n", input); return 0; }
注意事项
- 编译时直接使用
gcc编译即可,比如gcc test.c -o test,在VS Code的终端(Ubuntu默认终端)运行生成的可执行文件即可,默认终端均支持ANSI转义序列。 - 两种方案都没有修改终端的核心属性,无需担心程序异常退出导致终端状态错乱。
内容的提问来源于stack exchange,提问作者Andrei Apri
相关产品推荐
相关产品推荐

