C语言程序运行触发Segmentation Fault,求错误排查与解决方法
排查C语言程序中的Segmentation Fault问题
你的代码存在多个问题,其中main函数参数错误是直接触发段错误的核心原因,以下是逐一排查和修复方案:
1. main函数参数定义错误(直接导致段错误)
标准C语言的main函数签名为int main(int argc, char **argv),你错误地定义为int main(int argc, char **dict, char **jambles)。C语言中命令行参数只会通过argv数组传递,你自定义的dict和jambles并非合法的参数数组,访问dict[1]、jambles[1]时会直接访问非法内存,触发段错误。
修复代码:
int main(int argc, char **argv) { // 先检查命令行参数数量是否足够 if (argc < 3) { fprintf(stderr, "用法: %s <乱序单词文件路径> <字典文件路径>\n", argv[0]); return 1; } const char *j = argv[1]; FILE *jambles_file = fopen(j, "r"); // ... 后续代码 }
2. 文件打开未做错误检查
如果fopen失败(比如文件不存在、权限不足),会返回NULL指针。后续用NULL调用fgets会触发段错误,必须检查文件是否成功打开。
修复代码:
FILE *jambles_file = fopen(j, "r"); if (jambles_file == NULL) { perror("打开乱序单词文件失败"); return 1; } // 内层打开字典文件时同样要检查 FILE *dict_file = fopen(d, "r"); if (dict_file == NULL) { perror("打开字典文件失败"); fclose(jambles_file); // 关闭已打开的文件 return 1; }
3. 未关闭打开的文件(内存泄漏+潜在问题)
内层循环每次打开字典文件,但从未调用fclose(dict_file),会导致文件句柄泄漏,长时间运行可能引发系统资源耗尽问题。
修复代码:
while (fgets(dict_words, sizeof(dict_words), dict_file)) { // ... 内层循环逻辑 } fclose(dict_file); // 内层循环结束后关闭字典文件
4. fgets读取的换行符干扰排序匹配
fgets会把换行符\n也读入缓冲区,strlen会将其计入长度,排序时换行符会参与排序,导致strcmp无法正确匹配(比如文件中的"abc\n"和字典中的"abc"排序后结果不同)。
修复代码:
// 处理乱序单词的换行符 size_t len = strlen(jambles_words); if (len > 0 && jambles_words[len-1] == '\n') { jambles_words[len-1] = '\0'; } // 处理字典单词的换行符 len = strlen(dict_words); if (len > 0 && dict_words[len-1] == '\n') { dict_words[len-1] = '\0'; }
5. 排序修改原缓冲区,破坏原始数据
sorting函数直接修改传入的数组,导致下一次循环时jambles_words已经是排序后的状态,而非原始乱序单词,逻辑完全错误。
修复代码:
// 对乱序单词创建副本,用副本排序 char j_copy[51]; strcpy(j_copy, jambles_words); const char *sort_jambles = sorting(j_copy, strlen(j_copy)); // 对字典单词创建副本 char d_copy[51]; strcpy(d_copy, dict_words); const char *sort_dict = sorting(d_copy, strlen(d_copy));
6. "NO MATCHES"逻辑错误
你将else if (count == 0)放在内层循环中,每次遇到长度不匹配的单词都会打印这句话,这不符合需求。应该在内层循环结束后,统一判断是否没有匹配项。
修复代码:
// 内层循环中去掉else if(count ==0)的代码 while (fgets(dict_words, sizeof(dict_words), dict_file)) { // ... 匹配逻辑 } // 内层循环结束后判断是否无匹配 if (count == 0) { printf("NO MATCHES\n"); }
内容的提问来源于stack exchange,提问作者user19159910
相关产品推荐
相关产品推荐

