2010-03-21 5 views
4

나는 strcat을 혼자서 구현하려고 시도했다. strcat 구현을 Wiki에서 찾았지만 ......... 사용할 때 조각화 오류가 발생한다.strcat 구현

아래 코드에 어떤 문제가 있습니까?

char * 
strcat(char *dest, const char *src) 
{ 
    size_t i,j; 
    for (i = 0; dest[i] != '\0'; i++) 
     ; 
    for (j = 0; src[j] != '\0'; j++) 
     dest[i+j] = src[j]; 
    dest[i+j] = '\0'; 
    return dest; 
} 
+3

코드가 정상적으로 보입니다. 올바르게 사용 하시겠습니까? "클라이언트 코드"란 무엇입니까? – jpalecek

+0

질문은 : "왜 위키 백과 사전 구현이 잘못 되었습니까?" 위키 토론 페이지 (http://en.wikipedia.org/wiki/Talk:Strcat)에서 요청해야합니다. 게다가, 아마도 깨진 클라이언트 코드 (존재하지도 않을 수도있는) 일 것입니다. –

+0

'dest' 또는'src'가 null인지 확인하십시오. – mpez0

답변

14

코드는 괜찮습니다.

발신자 코드에 문제가있는 것 같습니다.

대상 문자열에 충분한 메모리를 할당했는지 기억해 둡니까?

+1

특히 널 종결자를 위해. – SLaks

+7

+1, OP가 대상 매개 변수로 문자열 상수를 호출하는 것 같습니다. –

2

dest는이 구현에서 연결을 수용 할만큼 충분한 메모리가 있어야합니다. 이 구현에서는 호출자가 할당해야합니다. dest와 src가 모두 null로 끝나야합니다. dest가 충분한 메모리를 가지고 있지 않으면, 이것은 다른 것에 의해 사용될 수있는 메모리를 덮어 씁니다.

0

나에게 잘 작동하는지, 확인해 보았다.

#include "stdio.h" 


    char *strcat(char *dest, const char *src) 

    { 

    size_t i,j; 

    for (i = 0; dest[i] != '\0'; i++) 

     ; 

    for (j = 0; src[j] != '\0'; j++) 

     dest[i+j] = src[j]; 

    dest[i+j] = '\0'; 

    return dest; 

} 


void main(void) 

{ 

    char a[10]={"abc"}, b[10]={"def"}; 

    strcat(a,b); 

    printf("%s",a); 

    getchar(); 

} 
8

정수 오버플로를 우려하여 정수 인덱스가 아닌 포인터를 사용하는 것이 좋습니다. size_tchar *과 같은 수의 비트 일지라도 은 포인터를 추가하지 않을 색인을 추가합니다.

나는 다소 학문적이라고 생각합니다. 멀티 기가 바이트 문자열에 strcat()을 호출하면 모든 문제가 발생할 수 있습니다.

여기 완전성 '을 위해, 포인터 기반 버전의 :

char * 
my_strcat(char *dest, const char *src) 
{ 
    char *rdest = dest; 

    while (*dest) 
     dest++; 
    while (*dest++ = *src++) 
     ; 
    return rdest; 
} 

물론, 이것은 rdest 반환 값에 대한 공간의 또 다른 포인터의 가치를 가지고 간다,하지만 난 그게 잘 절충 생각합니다.

일반 응용 프로그램 코드에서 strcat()이라는 함수를 합법적으로 정의 할 수는 없습니다. 전체 네임 스페이스 (이름이 str으로 시작하는 공용 함수)는 구현을 위해 예약되어 있습니다.

0

대상 문자열에 충분한 메모리를 할당합니다. 즉, atleast (소스 문자열의 길이 +1).

+1

음 ... 이전 답변에 새로운 것은 없습니까? – kleopatra