如何修改类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
相关产品推荐
相关产品推荐

