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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 04:15:27