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

C语言文件字符串搜索程序Bug求助:仅搜索最后一个路径

嗨,我来帮你搞定这个问题!

你遇到的核心问题是所有路径指针都指向了同一个局部数组,导致最后只有最后一个路径被实际搜索,另外代码里还有几个明显的错误需要修正,我来一步步给你拆解并修复:

问题根源分析

  1. 指针指向冲突:你定义的char path[30];是局部数组,循环里每次输入路径都会覆盖它的内容,同时让argv[1+i]指向这个数组。循环结束后,所有argv里的指针都指向这最后一次覆盖的内容,自然只有最后一个路径生效。
  2. 未定义变量与非法操作:scanf("%30s",wyraz);里的wyraz是未定义变量;fflush(stdin)是C标准未定义的行为(仅允许对输出流使用fflush);直接修改原argv数组会导致越界访问(原argv长度由argc决定,你往后面加元素会访问不属于它的内存)。

修复后的完整代码

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

int main(int argc, char *argv[]){ 
    if(argc == 1){ 
        printf("No arguments given\n"); 
        return -1; 
    } else if(argc == 2){ 
        int path_quantity = 0; 
        // 确保输入合法的路径数量(正整数)
        while(path_quantity <= 0){ 
            printf("How many paths will you give:\n"); 
            // 处理输入非数字的异常情况
            if(scanf("%d", &path_quantity) != 1){
                // 清空输入缓冲区的无效内容
                while(getchar() != '\n');
                printf("Please enter a valid positive integer.\n");
            }
        } 

        // 动态分配存储路径的指针数组,避免修改原argv越界
        char **paths = malloc(sizeof(char*) * path_quantity);
        if(!paths){
            perror("Failed to allocate memory");
            return EXIT_FAILURE;
        }

        int i;
        char temp_path[30];
        for(i = 0; i < path_quantity; i++){ 
            printf("Give path number %d:\n", i+1); 
            // 读取路径到临时数组,预留终止符位置
            scanf("%29s", temp_path); 
            // 清理输入缓冲区的换行符
            while(getchar() != '\n');
            // 为当前路径单独分配内存,避免覆盖
            paths[i] = malloc(strlen(temp_path) + 1);
            if(!paths[i]){
                perror("Failed to allocate memory for path");
                // 提前释放已分配的内存,防止泄漏
                for(int k=0; k<i; k++) free(paths[k]);
                free(paths);
                return EXIT_FAILURE;
            }
            strcpy(paths[i], temp_path);
            printf("Stored path: %s\n", paths[i]);
        } 

        // 遍历所有路径执行搜索
        int j; 
        for (j = 0; j < path_quantity; j++){ 
            FILE *f = fopen(paths[j], "r"); 
            if(!f) { 
                perror("Can't open file"); 
                // 跳过无法打开的文件,继续处理下一个
                continue;
            } 
            char *line = NULL; 
            size_t len = 0; 
            ssize_t nread; 
            printf("--- Results from %s ---\n", paths[j]);
            while ((nread = getline(&line, &len, f)) != -1) { 
                char *occur = strstr(line, argv[1]); 
                if(occur != NULL){ 
                    printf("%s", line); 
                } 
            } 
            fclose(f); 
            // 释放getline动态分配的内存
            free(line);
        } 

        // 释放所有路径的内存,避免泄漏
        for(i=0; i<path_quantity; i++) free(paths[i]);
        free(paths);
    } 
    return 0;
}

关键优化点说明

  • 独立内存分配:每个路径都单独分配内存,确保指针指向不同的内容,不会被后续输入覆盖。
  • 避免修改原argv:改用动态分配的paths数组存储路径,彻底规避越界风险。
  • 输入健壮性提升:处理了非数字输入的情况,用getchar()替代fflush(stdin)清理缓冲区,符合C标准。
  • 内存泄漏防护:增加了内存分配失败的处理逻辑,释放所有已分配的内存后再退出。
  • 输出可读性优化:搜索结果前增加了文件名标识,方便区分不同文件的匹配内容。

内容的提问来源于stack exchange,提问作者J. Deniro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:38:53