我正在尝试从SPOJ(PL)解决StringMerge (PP0504B)问题。基本上问题是编写一个函数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
标志进行编译。
答案 0 :(得分:4)
关接一个。
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
周围的括号也是如此。
Woot,更多错误!
那么你继续在j
循环的每次迭代中继续增加for
两次。所以基本上你最终写的(大约)是为你分配空间的两倍。
此外,您在使用后free()
返回值string_merge()
时会泄漏内存。
此外,我看不到memset
的用途,我建议您使用fgets()
和strtok_r()
来获取两个单词而不是scanf()
(这不符合你的想法。
答案 1 :(得分:0)
char *new_array = malloc (sizeof (char) * (len*2 + 1));
new_array[len*2] = '\0';