-1

我正在尝试解决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=c99flag 编译它。

4

2 回答 2

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

哇,进一步的错误!

因此,您继续前进并在循环j的每次迭代中递增两次for。所以基本上你最终写的字符(大约)是你分配空间的两倍。

此外,您通过不使用 afterfree()的返回值来泄漏内存。string_merge()

此外,我看不到memsets 的用途,我也建议您使用fgets()andstrtok_r()来获取这两个词而不是scanf()(它不会像您认为的那样做)。

于 2013-04-10T18:09:12.980 回答
0
char *new_array = malloc (sizeof (char) * (len*2 + 1));
new_array[len*2] = '\0';
于 2013-04-10T18:29:14.547 回答