函数返回 null 而不是 C 中的数组

问题描述 投票:0回答:1

所以我正在用 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)。因此数组正确存储了值,但返回它时存在一些问题。有人可以帮忙吗?

c
1个回答
0
投票

如果函数仅返回一个指针

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

© www.soinside.com 2019 - 2024. All rights reserved.