所以我正在用 C 解决 Leetcode 上的“最长公共前缀”问题,并且几乎可以正常工作了。我的代码:
char * longestCommonPrefix(char ** strs, int strsSize){
int minlen = strlen(strs[0]);
for(int i=0; i<strsSize; i++){
int len = strlen(strs[i]);
if(len<minlen){
minlen=len;
}
}
int len=0;
for(int i=0; i<minlen; i++){
int match=1;
char check = strs[0][i];
for(int j=0; j<strsSize; j++){
if(strs[j][i]!=check){
match=0;
break;
}
}
if(match==0){
break;
}
else{
len++;
}
}
if(len==0){
return "";
}
char ret[len];
for(int i=0; i<len; i++){
ret[i] = strs[0][i];
}
for(int i=0; i<len; i++){
printf("%c",ret[i]);
}
return ret;
}
打印出数组 ret 正在计算并给出预期的输出。但是当我返回 char 数组 ret 时,它返回(null)。因此数组正确存储了值,但返回它时存在一些问题。有人可以帮忙吗?
如果函数仅返回一个指针
char * longestCommonPrefix(char ** strs, int strsSize){
那么它应该返回一个指向字符串的指针。局部可变长度数组
ret
声明如下
char ret[len];
不是为了存储字符串而构建的。
而且退出该功能后不会再存活,因为它有自动存储期限。因此,返回的指针将无效,取消引用它将调用未定义的行为。
另一方面,在这个 return 语句中
if(len==0){
return "";
}
您正在返回一个具有静态存储持续时间的字符串(字符串文字)。
在这两种情况下,您都需要为结果字符串动态分配内存。
还有这个代码片段
int minlen = strlen(strs[0]);
for(int i=0; i<strsSize; i++){
int len = strlen(strs[i]);
if(len<minlen){
minlen=len;
}
}
只是多余的。请注意,对于字符串长度,您应该使用无符号整数类型
size_t
而不是有符号类型 int
。