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++标准语法,只有部分编译器提供扩展支持,代码可移植性差,且当前场景下完全不需要额外定义数组存储长度。
修复方案
- 替换
sofar的计算逻辑:直接用strs.size()获取字符串数组的元素个数,注意先判空,输入为空时直接返回空字符串。 - 初始化
minlen:可以初始化为第一个字符串的长度,或者初始化为足够大的常量INT_MAX(需要包含<climits>头文件)。 - 删掉不必要的变长数组
len,遍历过程中直接取每个字符串的长度比较即可。 - 调整公共前缀匹配逻辑,逐位判断所有字符串的同位置字符是否相同,相同才追加到结果里,遇到不同直接终止循环。
修复后的参考代码:
#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
相关产品推荐
相关产品推荐

