任务:
您将获得一个字符串数组 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) 分配所得到的最长字符串的长度
。
关于连续字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60736096/