2013-04-10 3 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, 추가 오류!

그래서 당신은 계속하고 for 루프의 각 반복 내에서 두 번 j를 증가. 그래서 본질적으로 당신은 (대략) 당신이 공간을 할당 한 것보다 2 배 많은 문자를 씁니다.

또한 사용 후 string_merge()의 반환 값이 free()이 아니므로 메모리가 누출됩니다.

또한, 나는 memset들,위한 것 또한 당신이 (당신이하지 생각하지 않는다) 대신 scanf()의 두 단어를 얻기 위해 fgets()strtok_r()를 사용하는 것이 좋습니다 무엇을 볼 수 없습니다.

+0

고마워, 질문이 하나 더있다 - 'malloc (sizeof (char) * len)'이 어딘가에 있다는 것을 발견했다. 유용 할 수있는 조건이 있는가? – syntagma

+0

@REACHUS 아니,별로. 많은 사람들이'sizeof()'를 오용합니다 (특히'malloc() '과 결합 할 때). –

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