You need to enable JavaScript to run this app. C语言实现累积法查找最长公共前缀运行结果异常求助
优惠活动
大模型
产品
解决方案
定价
更多

C语言实现累积法查找最长公共前缀运行结果异常求助

代码错误修复说明

核心问题列表

  • 错误计算数组长度:strs是二级指针,sizeof(strs) / sizeof *strs只能得到指针本身长度除以单元素指针长度,无法得到真实数组元素个数,必须使用题目传入的strsSize参数。C语言没有C++容器的内置长度查询能力,必须依赖传入的长度参数。
  • 内存申请错误:初始仅为result申请了1字节内存,后续拼接字符会发生缓冲区溢出,产生未定义行为;且初始内存没有设置结束符\0,字符串拼接函数无法正常工作。
  • 字符串操作函数使用错误:strncpy、strncat的第一个参数要求为char*类型,你传入字符变量current属于类型不匹配,完全不符合函数调用要求。单个字符赋值直接用等号即可,不需要调用字符串拷贝函数。
  • 字符串未补结束符:匹配中断直接返回时,result末尾没有追加\0,返回的不是合法C字符串。
  • 内存泄漏风险:单元素场景直接将原字符串地址赋值给result,会丢失最初申请的堆内存地址,造成泄漏。

修复后可运行代码

char * longestCommonPrefix(char ** strs, int strsSize){
    // 边界处理:空数组直接返回空字符串
    if(strsSize == 0) {
        char* res = (char*)malloc(1);
        res[0] = '\0';
        return res;
    }

    // 计算最短字符串长度
    int smallestWordSize = 201;
    for (int index = 0; index < strsSize; ++index) {
        int len = strlen(strs[index]);
        if (len < smallestWordSize) {
            smallestWordSize = len;
        }
    }  

    // 申请足够的内存:最长公共前缀不会超过最短字符串长度+1(存结束符)
    char *result = (char *) malloc(smallestWordSize + 1);
    result[0] = '\0'; // 初始化结束符,保证后续操作正常
    char current;

    // 单元素场景直接拷贝字符串返回
    if(strsSize == 1){
        strcpy(result, strs[0]);
        return result;
    }

    // 逐位匹配公共前缀
    for (int i = 0; i < smallestWordSize; ++i) {
        current = strs[0][i];
        for (int j = 1; j < strsSize; ++j) {
            if (current != strs[j][i]) {
                // 匹配失败,直接返回当前已拼接的结果
                return result;
            }
        }
        // 追加当前匹配成功的字符
        result[i] = current;
        result[i+1] = '\0'; // 实时补结束符
    }

    return result;
}

内容的提问来源于stack exchange,提问作者terrylt1

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 04:00:04