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

在C语言中通过read()从标准输入区分剪贴板粘贴与键盘输入

区分终端输入中的键盘输入与剪贴板粘贴文本

我正在开发一款基于终端的文本编辑器,最近卡在了一个关键环节:如何用read()函数从标准输入读取内容时,区分出内容是剪贴板粘贴的文本还是用户手动键盘输入的文本?

最开始我采用的是逐个字节读取的方式,代码如下:

#include <unistd.h>
char read_key_input() {
    char ch;
    int read_count;
    while ((read_count = read(STDIN_FILENO, &ch, 1)) != 1) {
        // 处理可能出现的错误
    }
    return ch;
}

后来参考了@AnttiHaapala的建议,我调整了实现逻辑——改为一次性读取多个字节,再根据读取到的字节数量来判断输入类型,最终的实现方案如下:

#include <stdlib.h>
#include <stdint.h>
#include <unistd.h>

void read_key_input(void (*callback)(int)) {
    char* text = malloc(UINT8_MAX);
    int read_count;
    while ((read_count = read(STDIN_FILENO, text, UINT8_MAX)) == -1) {
        // 处理可能出现的错误
    }
    // 若发现转义序列则提前处理并返回
    ...
    if (read_count > 1) {
        // 大概率是剪贴板文本,切换编辑器至输入模式并逐个处理字符
    } else {
        // 为用户键盘输入内容
    }
    // 若切换过模式则恢复原编辑器模式
    free(text); // 记得释放分配的内存
}

这个方案的核心逻辑很简单:用户手动键盘输入通常是单次输入一个字符(read_count等于1),而剪贴板粘贴的文本一般会一次性传入多个字符(read_count大于1)。目前这个实现已经完全能满足我的文本编辑器需求,如果后续有优化调整,我会再来更新。

内容的提问来源于stack exchange,提问作者Jiten Devlani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 19:07:28