C语言三字符串最长公共子串函数偶发Bug排查求助
问题排查与修复方案
核心问题分析
你的代码存在多个导致偶尔出错的问题,逐一拆解如下:
1. 拼写错误引发未定义行为
代码中strinh2是string2的笔误,这个未声明的标识符会让编译器读取随机内存值,直接导致运行时不可预测的结果,这是偶尔返回错误结果的关键原因之一。
2. strspn的误用导致逻辑完全错误
strspn(s1, s2)的作用是返回s1前缀中**所有字符都属于s2**的最长长度,并非判断s1的子串是否是s2的连续子串。比如你的测试用例中,strspn(&string1[0], string2)会返回2(因为'i'和's'都在string2中),这就错误地触发了长度更新,导致返回"is"。
同时,原代码中strspn(&string1[i], string2) == strspn(&string2[j], string3)的条件完全不成立,两个strspn的结果相等不代表存在连续的公共子序列。
3. 三重循环的匹配逻辑错误
原代码仅在三个字符串的当前字符相等时做判断,但没有检查后续连续字符是否在三个字符串中同时匹配,根本无法正确定位最长连续公共子串。
4. 初始值设置不合理
length初始化为1,当没有任何公共子串时,会返回string1起始位置的一个字符,不符合预期逻辑。
修复后的代码实现
以下是正确实现三个字符串最长公共子串的代码,采用逐字符扩展匹配的方式,确保逻辑正确性:
#include <stdio.h> #include <stdlib.h> #include <string.h> char* findSubstring(char* string1, char* string2, char* string3) { int max_len = 0; int start_pos = 0; int len1 = strlen(string1); int len2 = strlen(string2); int len3 = strlen(string3); // 遍历string1的所有起始位置 for (int i = 0; i < len1; i++) { // 遍历string2的所有起始位置 for (int j = 0; j < len2; j++) { // 当前字符不相等,直接跳过 if (string1[i] != string2[j]) continue; // 遍历string3的所有起始位置 for (int k = 0; k < len3; k++) { if (string1[i] != string3[k]) continue; // 同步扩展,找到当前起始点的最长匹配长度 int current_len = 0; while (i + current_len < len1 && j + current_len < len2 && k + current_len < len3 && string1[i + current_len] == string2[j + current_len] && string1[i + current_len] == string3[k + current_len]) { current_len++; } // 更新最长公共子串的信息 if (current_len > max_len) { max_len = current_len; start_pos = i; } } } } // 分配内存,处理内存分配失败的情况 char* result = (char*)malloc(max_len + 1); if (result == NULL) { fprintf(stderr, "内存分配失败\n"); return NULL; } if (max_len > 0) { strncpy(result, &string1[start_pos], max_len); } result[max_len] = '\0'; return result; } // 测试示例 int main() { char* s1 = "isdbhfjdfklekrumpirisbgozuesbgbzu"; char* s2 = "rgekrumpirasz954ho8g"; char* s3 = "juidfg7808h5840870ghghkrumpirizg78jue56780jgeo8579h9krumpir"; char* sub = findSubstring(s1, s2, s3); printf("最长公共子串:%s\n", sub); free(sub); return 0; }
修复后的优势
- 修正了拼写错误,彻底消除未定义行为
- 采用逐字符同步扩展的方式,准确判断三个字符串中的连续公共子串
- 增加了内存分配失败的错误处理,提升代码鲁棒性
- 初始值
max_len设为0,无公共子串时返回空字符串,符合预期逻辑
内容的提问来源于stack exchange,提问作者HelpMe
相关产品推荐
相关产品推荐

