-1

SPOJ (PL) からStringMerge (PP0504B)の問題を解決しようとしています。基本的に問題は、char 配列から作成された文字列を使用して char 配列へのポインターを返す関数string_merge(char *a, char *b)を作成し、後続の 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フラグを付けてコンパイルしています。

4

2 に答える 2

4

オフバイワン。

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

の境界を越えて書いていますnew_arraylen + 1バイトにスペースを割り当てる必要があります。

char *new_array = malloc(len + 1);

また、sizeof(char)は常に 1 であるため、スペルアウトするのは不要lenです。

うーん、さらなるエラー!

したがって、ループjの各反復内で続けて 2 回インクリメントします。forしたがって、基本的には、割り当てたスペースの (約) 2 倍の文字を書き込むことになります。

free()また、使用後の戻り値を ingしないことでメモリ リークが発生していstring_merge()ます。

さらに、 s の目的がわかりません。また、2つの単語を取得する代わりにandmemsetを使用することをお勧めします(これは、あなたが思っていることをしません)。fgets()strtok_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 に答える