C语言文件字符串搜索程序Bug求助:仅搜索最后一个路径
嗨,我来帮你搞定这个问题!
你遇到的核心问题是所有路径指针都指向了同一个局部数组,导致最后只有最后一个路径被实际搜索,另外代码里还有几个明显的错误需要修正,我来一步步给你拆解并修复:
问题根源分析
- 指针指向冲突:你定义的
char path[30];是局部数组,循环里每次输入路径都会覆盖它的内容,同时让argv[1+i]指向这个数组。循环结束后,所有argv里的指针都指向这最后一次覆盖的内容,自然只有最后一个路径生效。 - 未定义变量与非法操作:
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
相关产品推荐
相关产品推荐

