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

如何修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 09:57:32