任务:您会得到一个字符串数组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;
}
我的代码工作正常,但内存泄漏。有什么想法可以解决上述问题吗?
编辑:一个美观的解决方案,我发现对有兴趣的任何人使用索引(start
和nd
)
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;
}
问题出在对malloc(sizeof(strarr))
的两次调用中。变量strarr是指向字符串的指针,而不是尚未分配的字符串本身。 strarr的大小足以容纳一个地址或几个字符,但通常不包含整个字符串。因此,您正在使用内存的随机部分来存储字符串的结尾。
如果您或多或少保持代码原样,则需要知道使用malloc(sizeof(char) * max_length_returned)
分配的最长字符串的长度。
您在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
中是否还有更多错误。