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;
}