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
相关产品推荐
相关产品推荐

