连续字符串

问题描述 投票:2回答:2

任务:您会得到一个字符串数组strarr和一个整数k。您的任务是返回第一个最长的字符串,该字符串由数组中采用的k个连续字符串组成。

示例

longest_consec(["zone", "abigail", "theta", "form", "libe", "zas", "theta", "abigail"], 2) --> "abigailtheta"

注意:连续的字符串接连不断,不间断,

最终代码(有效):

char *longestConsec(char *strarr[], int n, int k) {
    if (n == 0 || k > n || k <= 0)
        return "";

    int max_len = 0, len, max_length_returned = 0;
    for (int l = 0; l < n; ++l) {
        max_length_returned += (int)strlen(strarr[l]);
    }
    char *max_str = (char *)malloc(sizeof(char) * max_length_returned + 1); // problem was here - not freed (because need to return it)
    char *str_temp = (char *)malloc(sizeof(char) * max_length_returned + 1);

    for (int i = 0; i < n - k + 1; ++i) {
        strcpy(str_temp, strarr[i]);
        for (int j = 1; j < k; ++j) {
            strcat(str_temp, strarr[i + j]);
        }
        len = (int)strlen(str_temp);
        if (max_len < len) {
            max_len = len;
            strcpy(max_str, str_temp);
        }
    }
    free(str_temp);
    return max_str;
}

int main() {
    char *a[] = { "zone", "abigail", "theta", "form", "libe", "zas", "theta", "abigail" };
    char *longest = longestConsec(a, 8, 2);
    printf("string: %s\nlength: %d\n", longest, (int)strlen(longest));
    free(longest);
    return 0;
}

我的代码工作正常,但内存泄漏。有什么想法可以解决上述问题吗?

编辑:一个美观的解决方案,我发现对有兴趣的任何人使用索引(startnd

char *longestConsec(char *strarr[], int n, int k) {
    if ((n == 0) || (k > (int)n) || (k <= 0))
        return "";
    int maxSum = 0, start = 0, nd = 0; // creating indexes
    for (int i = 0; i <= n - k; i++) {
        int sum = 0;
        for (int j = i; j < i + k; j++)
            sum += (int)strlen(strarr[j]);
        if (sum > maxSum) {
            maxSum = sum; start = i; nd = i + k;
        }
    }
    char *longest = malloc(sizeof(char) * maxSum + 1); // have the exact amount to allocate
    longest[0] = '\0'; // The terminating null character in destination is overwritten by the first character of source
    for (int c = start; c < nd; c++)
        strcat(longest, strarr[c]);
    return longest;
}
c string
2个回答
1
投票

问题出在对malloc(sizeof(strarr))的两次调用中。变量strarr是指向字符串的指针,而不是尚未分配的字符串本身。 strarr的大小足以容纳一个地址或几个字符,但通常不包含整个字符串。因此,您正在使用内存的随机部分来存储字符串的结尾。

如果您或多或少保持代码原样,则需要知道使用malloc(sizeof(char) * max_length_returned)分配的最长字符串的长度。


1
投票

您在main中的代码仍然不完全正确。您两次调用longestConsec,并且永远不会释放返回的内存。

您需要释放longestConsec返回的内存:

int main()
{
  char* a[] = { "zone", "abigail", "theta", "form", "libe", "zas", "theta", "abigail" };

  char* longest = longestConsec(a, 8, 2);  // call longestConsec only once
  printf("string: %s\nlength: %d\n", longest, (int)strlen(longest));
  free(longest);

  return 0;
}

通常所说:malloc和朋友返回的任何内容都必须在某个时候通过调用free来释放。

免责声明:我没有检查longestConsec中是否还有更多错误。

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