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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 09:06:39