在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
相关产品推荐
相关产品推荐

