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

如何修改类Linux grep的C函数,将匹配单词设置为红色?

如何让类Linux grep的C函数仅高亮匹配的单词(而非整行)?

现有一个类Linux grep命令的C语言函数,功能是搜索指定单词并打印包含该单词的所有行。现在需要修改这个函数,仅将匹配到的目标单词设置为红色(而非整行),请问该如何实现?

原代码如下:

#include<stdio.h> 
#include<string.h> 
void main() { 
    char fn[10],pat[10],temp[200]; 
    FILE *fp; 
    printf("Enter file name\n"); 
    scanf("%s",fn); 
    printf("Enter pattern to be searched\n"); 
    scanf("%s",pat); 
    fp=fopen(fn,"r"); 
    while(!feof(fp)){ 
        fgets(temp,200,fp); 
        if(strstr(temp,pat)!=NULL){ 
            printf("%s",temp); 
        } 
    } 
    fclose(fp); 
}

嘿,这个需求其实很好实现,核心思路就是把每行内容拆成「匹配词之前的普通文本」、「带颜色的匹配词」、「匹配词之后的普通文本」三部分来输出,而不是直接整行打印。我帮你修改了代码,还顺便修复了原代码里的几个小问题,一起来看看:

修改后的完整代码

#include<stdio.h> 
#include<string.h> 

// 定义ANSI颜色控制宏,方便调用
#define RED "\033[31m"
#define RESET "\033[0m"

int main() {  // 改用标准的int main(),符合C语言规范
    char fn[100], pat[100], temp[200];  // 增大数组长度,避免输入溢出
    FILE *fp; 
    char *match_pos, *current_start;

    printf("Enter file name: "); 
    scanf("%99s", fn);  // 限制输入长度,防止缓冲区溢出
    printf("Enter pattern to be searched: "); 
    scanf("%99s", pat); 

    // 增加文件打开失败的错误处理
    fp = fopen(fn, "r");
    if(fp == NULL) {  
        perror("Failed to open file");
        return 1;
    }

    // 用fgets的返回值判断文件结束,比feof更可靠(原代码的feof会导致重复打印最后一行)
    while(fgets(temp, sizeof(temp), fp) != NULL) {
        current_start = temp;
        // 循环查找当前行内的所有匹配项(支持一行多个匹配)
        while((match_pos = strstr(current_start, pat)) != NULL) {
            // 打印匹配词之前的普通文本
            fwrite(current_start, 1, match_pos - current_start, stdout);
            // 打印红色高亮的匹配词
            printf("%s%s%s", RED, pat, RESET);
            // 更新指针位置,继续查找下一个匹配
            current_start = match_pos + strlen(pat);
        }
        // 打印当前行剩余的未匹配文本
        printf("%s", current_start);
    }

    fclose(fp);
    return 0;
}

关键实现说明

  • 终端颜色控制:用ANSI转义序列\033[31m开启红色文本,\033[0m恢复默认颜色,这是绝大多数现代终端(Linux bash、macOS Terminal、Windows PowerShell等)都支持的标准方式。
  • 逐段输出逻辑:不再整行打印,而是通过strstr逐个定位匹配词的位置,分三段输出:匹配前的普通文本 → 红色匹配词 → 剩余的普通文本,这样就能精准高亮目标单词。
  • 原代码优化:
    • 把void main()改成标准的int main(),符合C语言规范;
    • 增大数组长度并限制输入长度,避免缓冲区溢出;
    • 用fgets的返回值判断文件结束,解决原代码feof导致的最后一行重复打印问题;
    • 增加文件打开失败的错误提示,提升程序健壮性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:10:49