구현

2012-12-05 3 views
3

가능한 중복 :
Any better suggestions for this c functions copyString,concatString구현

이, 나는 그것을 구현해야 질문이 면접을 형성입니다 특정 서명이 내가 일할 필요가 코드입니다 :

int main(int argc, char *argv[]) 
{ 

    char *str = NULL; 
    new_strcpy(&str , "string one"); 
    new_strcpy(&str , str +7); 
    new_strcat(&str , " two"); 
    new_printf(&str , "%str !", s); 
    puts(str); 
    new_free(&str); 
    return 0; 
} 

이것은 내 구현 new_strcp입니다 y :

char* new_strcpy(char **dst,const char *source) 
{ 

    char *ans=*dst; 

    while(**dst++=*source++); 

    return ans; 

} 

하지만이 솔루션 충돌이 누군가 나를 도울 수 있습니까?

+0

** ** dst ++'는 모두를 위해 괄호를 사용합니다. – UmNyobe

+3

"이것은 취업 인터뷰 형식의 질문입니다."- 미안하지만, C에게 알리려고하지 말았어야합니다. –

+0

아마도 인터뷰 대상자는 코드 재사용의 이점과 힙 메모리를 할당하고 해제하는 방법을 언급했을 것입니다. (예 : 아주 좋은 인터뷰 질문이 아닙니다) – bph

답변

6

해결 방법의 문제점은 *dst에 대한 메모리 할당에 실패했기 때문입니다.

처음 세 작업을 필요로하는 코드의 라인을 고려 :

  1. new_strcpy() 필요 결과에 대한 메모리를 할당이에서

    char *str = NULL; 
    new_strcpy(&str , "string one"); 
    new_strcpy(&str , str +7);   // *** 
    

    를, 분명하다.

  2. str을 새로 할당 할 때 메모리 누수가 없도록 new_strcpy()은 이전 str의 할당을 해제해야합니다.
  3. 위의 작업을 위의 *** 행으로 만들려면 할당 후 의 할당 해제가 발생해야합니다.

다음은 아이디어를 제공하는 스켈레톤 구현입니다. strcpy() 그 외의 기능을 구현하지만 라이브러리 함수를 호출하는 것이 허용되지 않는 경우 자체 루프를 작성할 수 있습니다 (이미 수행 방법을 알고 있습니다).

#include <stdlib.h> 
#include <string.h> 

void new_strcpy(char** dst, const char* src) { 
    char* orig_dst = *dst; 
    *dst = malloc(strlen(src) + 1); 
    strcpy(*dst, src); /* replace with a loop if calling strcpy() is not permissible */ 
    free(orig_dst); 
} 

void new_strcat(char** dst, const char* src) { 
    char* orig_dst = *dst; 
    *dst = malloc(strlen(*dst) + strlen(src) + 1); 
    strcpy(*dst, orig_dst); /* replace with a loop if calling strcpy() is not permissible */ 
    strcat(*dst, src);  /* ditto for strcat() */ 
    free(orig_dst); 
} 

void new_free(char** dst) { 
    free(*dst); 
    *dst = NULL; 
} 

int main(int argc, char *argv[]) 
{ 
    char *str = NULL; 
    new_strcpy(&str , "string one"); 
    new_strcpy(&str , str +7); 
    new_strcat(&str , " two"); 
/* new_printf(&str , "%str !", s); */ 
    puts(str); 
    new_free(&str); 
    return 0; 
} 

독자는 연습을 위해 new_printf()을 그대로 둡니다. :-)

+0

무료 (orig_dst); 잘못된 것입니다. 그것으로 당신은 * dst의 기억을 잃을 것입니다. 그 무대에서 메모리를 비워서는 안됩니다. – MOHAMED

+0

@ 모하메드 칼라 : 당신은 완전히 요점을 놓치고 있습니다. OP의'main()'에서 함수가 어떻게 사용되는지보십시오. – NPE

+0

질문은'strcpy'의 대체 함수를 개발하고'new_strcpy' 함수에서 strcp를 사용하지 말아야합니다. – MOHAMED