답변
코드는 괜찮습니다.
발신자 코드에 문제가있는 것 같습니다.
대상 문자열에 충분한 메모리를 할당했는지 기억해 둡니까?
특히 널 종결자를 위해. – SLaks
+1, OP가 대상 매개 변수로 문자열 상수를 호출하는 것 같습니다. –
dest는이 구현에서 연결을 수용 할만큼 충분한 메모리가 있어야합니다. 이 구현에서는 호출자가 할당해야합니다. dest와 src가 모두 null로 끝나야합니다. dest가 충분한 메모리를 가지고 있지 않으면, 이것은 다른 것에 의해 사용될 수있는 메모리를 덮어 씁니다.
나에게 잘 작동하는지, 확인해 보았다.
#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();
}
정수 오버플로를 우려하여 정수 인덱스가 아닌 포인터를 사용하는 것이 좋습니다. size_t
이 char *
과 같은 수의 비트 일지라도 은 포인터를 추가하지 않을 색인을 추가합니다.
나는 다소 학문적이라고 생각합니다. 멀티 기가 바이트 문자열에 strcat()
을 호출하면 모든 문제가 발생할 수 있습니다.
여기 완전성 '을 위해, 포인터 기반 버전의 :
는char *
my_strcat(char *dest, const char *src)
{
char *rdest = dest;
while (*dest)
dest++;
while (*dest++ = *src++)
;
return rdest;
}
물론, 이것은 rdest
반환 값에 대한 공간의 또 다른 포인터의 가치를 가지고 간다,하지만 난 그게 잘 절충 생각합니다.
일반 응용 프로그램 코드에서 strcat()
이라는 함수를 합법적으로 정의 할 수는 없습니다. 전체 네임 스페이스 (이름이 str
으로 시작하는 공용 함수)는 구현을 위해 예약되어 있습니다.
코드가 정상적으로 보입니다. 올바르게 사용 하시겠습니까? "클라이언트 코드"란 무엇입니까? – jpalecek
질문은 : "왜 위키 백과 사전 구현이 잘못 되었습니까?" 위키 토론 페이지 (http://en.wikipedia.org/wiki/Talk:Strcat)에서 요청해야합니다. 게다가, 아마도 깨진 클라이언트 코드 (존재하지도 않을 수도있는) 일 것입니다. –
'dest' 또는'src'가 null인지 확인하십시오. – mpez0