2013-04-10 4 views
-1

Я пытаюсь решить проблему с SPOJ (PL) StringMerge (PP0504B). В основном проблема заключается в том, чтобы написать функцию string_merge(char *a, char *b), которая возвращает указатель на массив символов со строкой, созданной из массивов символов с последующими символами, выбранными попеременно (длина массива - длина более короткого массива, предоставленного в качестве аргумента).Манипуляция динамическими массивами в C

Программа, которую я создал, хорошо работает с тестовыми примерами, но она терпит неудачу, когда я отправляю ее судье 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

Попробуйте это с помощью ElectricFence или 'valgrind'. –

ответ

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 s являются для, и я предлагаю вам использовать fgets() и strtok_r() для получения двух слов вместо scanf() (которые не делают то, что вы думаете, он делает).

+0

Спасибо, еще один вопрос: я нашел 'malloc (sizeof (char) * len)' где-то на SO, есть ли какие-либо условия, когда это может быть полезно? – syntagma

+0

@REACHUS Нет, не совсем. Многие люди злоупотребляют 'sizeof()' (особенно в сочетании с 'malloc()'). – 2013-04-10 19:11:53

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