如何修改C语言搜索代码以返回所有匹配字符串的结果?
如何修改代码实现字符串搜索返回所有匹配结果?
你的现有代码核心问题是找到第一个匹配项后就执行了break;,直接退出循环,因此只能返回第一个结果。以下是针对性的修改方案:
关键修改点
- 移除
break;语句:这是终止循环的根本原因,删除后会遍历文件所有行,找出全部匹配项。 - 动态调整输出行号:原代码固定输出到第11行,多次匹配会互相覆盖,新增行号变量控制输出位置,避免内容重叠。
- 优化循环内冗余操作:
header()和搜索状态提示不需要每次循环都执行,移到循环外减少不必要的刷新。 - 修正文件打开模式:仅读取文件时使用
"r"即可,无需"r+"的写权限。
修改后的完整代码
int search_contact() { if (chdir(getenv("HOME")) == 0) { FILE *fp; // 仅读取文件,使用"r"模式更安全 fp = fopen(".igterm/hosts4.txt", "r"); if (NULL == fp) { printf("couldn't open hosts4.txt\n"); return 1; } attron(A_BOLD | COLOR_PAIR(2)); mvaddstr(6, 0, "Search : "); attroff(A_BOLD | COLOR_PAIR(2)); char needle[200]; scanw("%s", needle); // 先绘制一次header,避免循环内重复刷新 header(); // 初始输出行号,从第11行开始 int output_line = 11; // 打印搜索提示,只执行一次 printf("\e[9;01H\e[1;34mSearching for \e[0;37m[\e[1;37m%s\e[0;37m]\e[1;34m...", needle); char haystack[200]; char *ptr2needle = NULL; while (fgets(haystack, sizeof(haystack), fp) != NULL) { // 处理换行符,注意先判断长度避免越界 if (haystack[strlen(haystack)-1] == '\n') { haystack[strlen(haystack)-1] = '\0'; } ptr2needle = strstr(haystack, needle); if (ptr2needle) { // 动态使用output_line控制输出位置,每次匹配后行号+1 printf("\e[%d;04H\e[0;37m[\e[1;37m%s\e[0;37m]", output_line, haystack); output_line++; // 移除break,继续遍历剩余行 } } fclose(fp); askyesno(); } return 0; // 补充缺失的返回值 }
额外说明
- 新增了换行符的安全判断:避免文件最后一行没有换行符时,修改
haystack[strlen(haystack)-1]导致越界。 - 补充了函数的返回值:原代码分支缺失返回值,可能引发未定义行为。
内容的提问来源于stack exchange,提问作者user2411434
相关产品推荐
相关产品推荐

