Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 连续字符串_C_String - Fatal编程技术网

C 连续字符串

C 连续字符串,c,string,C,String,任务: 您将获得一个字符串数组strarr,以及一个整数k。您的任务是返回第一个最长的字符串,该字符串由数组中的k连续字符串组成 示例: longest_consec(["zone", "abigail", "theta", "form", "libe", "zas", "theta", "abigail"], 2) --> "abigailtheta" 注意: 连续的字符串一个接一个,没有中断 最终代码(工作): 问题在于对malloc(sizeof(strarr))的两个调用。变量s

任务: 您将获得一个字符串数组
strarr
,以及一个整数
k
。您的任务是返回第一个最长的字符串,该字符串由数组中的
k
连续字符串组成

示例

longest_consec(["zone", "abigail", "theta", "form", "libe", "zas", "theta", "abigail"], 2) --> "abigailtheta"
注意: 连续的字符串一个接一个,没有中断

最终代码(工作):


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


如果您或多或少地维护代码,您将需要知道使用
malloc(sizeof(char)*max_length_returned)分配代码所产生的最长字符串的长度。
您在
main
中的代码仍然不完全正确。您正在调用
longestcesc
两次,但从未释放返回的内存

您需要释放由
longestcense
返回的内存:

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
来释放


免责声明:我没有检查
longestcense
中是否有更多的bug,您需要告诉我们更多的上下文。是否可以更改功能参数?调用方可以释放字符串吗?问题是什么?通常的方法是调用方释放或传入缓冲区。调用
longestcesce
的代码需要释放内存。请回答您的问题并向我们展示该代码。读这个:
sizeof(strarr)
也是错误的。这将给出单个指针的大小,而不是数组的大小。无法从指针计算数组大小。我假设
n
是数组中的元素数,所以你需要
malloc(n*sizeof(char*)
是的,参数可以更改。调用者是主函数,但它不能在那里释放它。我想任务要求我更改strarr参数,我试图用strcat()更改strarr[I]每次迭代但问题是dest字符串不够长,无法同时包含这两个字符串。这就是我创建max_str并为其分配内存的原因it@kaylum我不需要数组中的元素数,而是总的字符数,这样我就可以为最坏的情况分配所需的最大内存量,这是正确的,但这不是OP所要求的t、 谢谢beaucoup Pierre,它确实有效,但我仍然不明白它是如何克服内存泄漏的-我仍然没有释放它。(代码已更新)还提到
return”“;
不正确,因为调用方无法确定是否释放对象。
return strdup(“”)
是必需的。我试图说服你们两个,但似乎不可能。我给皮埃尔打电话是因为他分数少。无论如何,谢谢:)“似乎不可能”:为什么?发生了什么事?它让你的电脑着火了吗?@BarBenjamin lol“是不让我”:谁或什么是“它”?你只能回答一个“你只能回答一个”:仍然不太明白什么是“V”???
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;
}
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;
}