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

C++代码中minlen变量仅中间cout输出正常其余位置返回随机值问题

问题原因

  • minlen变量未初始化就参与比较:局部整型变量在栈上分配时不会自动清零,初始值是内存中残留的随机垃圾值。循环中执行if(len[i] < minlen)判断时,若初始的minlen随机值比所有字符串长度都小,那么minlen全程都不会被赋值,一直保留随机值;只有当初始随机值足够大时,才会被正确更新为最小长度,你观察到的偶尔输出正确值本质是未定义行为的随机表现。
  • sofar变量计算完全错误:strs是vector<string>类型的引用,sizeof(strs)计算的是vector对象本身的内存大小(64位系统下通常为24字节,存三个内部指针),不是容器内存储的字符串元素个数。你应该调用strs.size()获取元素数量,错误的sofar值会导致循环次数异常,甚至出现数组越界访问,进一步触发未定义行为。
  • 代码中使用的int len[sofar]是变长数组,属于C语言特性,不是C++标准语法,只有部分编译器提供扩展支持,代码可移植性差,且当前场景下完全不需要额外定义数组存储长度。

修复方案

  1. 替换sofar的计算逻辑:直接用strs.size()获取字符串数组的元素个数,注意先判空,输入为空时直接返回空字符串。
  2. 初始化minlen:可以初始化为第一个字符串的长度,或者初始化为足够大的常量INT_MAX(需要包含<climits>头文件)。
  3. 删掉不必要的变长数组len,遍历过程中直接取每个字符串的长度比较即可。
  4. 调整公共前缀匹配逻辑,逐位判断所有字符串的同位置字符是否相同,相同才追加到结果里,遇到不同直接终止循环。

修复后的参考代码:

#include <vector>
#include <string>
#include <climits>
#include <iostream>
using namespace std;

class Solution
{
public:
    string longestCommonPrefix(vector<string>& strs)
    {
        // 输入为空直接返回
        if (strs.empty()) return "";
        int sofar = strs.size();
        int minlen = INT_MAX;
        string newstr = "";

        // 计算所有字符串的最小长度
        for(int i = 0; i < sofar; i++)
        {
            int cur_len = strs[i].length();
            if(cur_len < minlen)
                minlen = cur_len;
        }

        // 测试输出
        cout << minlen << endl;
        cout << "sofar : " << sofar << endl << "minlen : " << minlen << endl;
        cout << minlen << endl;

        // 公共前缀匹配逻辑
        for(int i = 0; i < minlen; i++)
        {
            char cur_char = strs[0][i];
            for(int j = 1; j < sofar; j++)
            {
                if(strs[j][i] != cur_char)
                {
                    return newstr;
                }
            }
            newstr += cur_char;
        }

        return newstr;
    }
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 05:51:01