gpt4 book ai didi

c - 在 C 中操作动态数组

转载 作者:行者123 更新时间:2023-11-30 18:32:12 24 4
gpt4 key购买 nike

我正在尝试解决StringMerge (PP0504B)来自 SPOJ (PL) 的问题。基本上问题是编写一个函数 string_merge(char *a, char *b) ,该函数返回一个指向 char 数组的指针,其中包含从 char 数组创建的字符串,并交替选择后续字符(数组的长度为作为参数提供的较短数组的长度)。

我创建的程序在测试用例中运行良好,但当我将其发布给 SPOJ 的法官时却失败了。我在这里发布我的代码,因为我相信问题与内存分配有关(我仍在学习 C 的这一部分) - 你能看一下我的代码吗?

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>

#define T_SIZE 1001

char* string_merge(char *a, char *b);

char* string_merge(char *a, char *b) {
int alen = strlen(a); int blen = strlen(b);
int len = (alen <= blen) ? alen : blen;
int i,j;

char *new_array = malloc (sizeof (char) * (len));
new_array[len] = '\0';
for(j=0,i=0;i<len;i++) {
new_array[j++] = a[i];
new_array[j++] = b[i];
}
return new_array;
}

int main() {
int n,c; scanf("%d", &n);
char word_a[T_SIZE];
char word_b[T_SIZE];
while(n--) {
scanf("%s %s", word_a, word_b);
char *x = string_merge(word_a, word_b);
printf("%s",x);
printf("\n");
memset(word_a, 0, T_SIZE);
memset(word_b, 0, T_SIZE);
memset(x,0,T_SIZE);
}
return 0;
}

注意:我使用 -std=c99 标志编译它。

最佳答案

差一分。

char *new_array = malloc (sizeof (char) * (len));
new_array[len] = '\0';

您的写入超出了 new_array 的范围。您必须分配 len + 1 字节的空间:

char *new_array = malloc(len + 1);

此外,sizeof(char) 始终为 1,因此将其拼写出来是多余的,len 周围的括号也是多余的。

哇,更多错误!

因此,您继续在 for 循环的每次迭代中将 j 递增两次。因此,本质上,您最终写入的字符数(大约)是您分配的空间的两倍。

此外,如果在使用后不free()处理string_merge()的返回值,则会泄漏内存。

此外,我不明白 memset 的用途,我也建议您使用 fgets()strtok_r()用于获取这两个单词而不是 scanf() (它不会执行您认为的操作)。

关于c - 在 C 中操作动态数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15933153/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com