참조) http://kldp.org/node/2084

strncpy는 문자열을 정해진 수만큼 복사를 하되, string의 끝을 알리는 0x00을 만나면 거기서 중지합니다. 

예를 들어 char *A="ABCD\0EFG" 일때 memcpy(B,A,8) 하시고
printf( "%s",&B[5] ) 해보시면 0x00뒤의 EFG가 찍히는 것을
보실수 있습니다. strncpy(B,A,8) 이라면 그렇지 않구요.

strcpy 소스 이구요... (linux)

char * strcpy(char * dest,const char *src)
{
char *tmp = dest;

while ((*dest++ = *src++) != '\0')
/* nothing */;
return tmp;
}

memcpy 소스 입니다. (linux)

void*
memcpy(void* __dest, __const void* __src,
size_t __n)
{
int i;
char *d = (char *)__dest, *s = (char *)__src;

for (i=0;i<__n;i++) d[i] = s[i];
}


c 소스 코드를 보면, memcpy와 strncpy의 수행속도는 다릅니다.
memcpy는 CS 레지스터를 사용해서 고속복사가 가능하지만, strncpy의 경우는 string의 끝을 체크해야 하기 때문에 고속복사가 불가능하다.

그러므로, string 의 복사라 하더라도 string 크기가 정해져 있을 경우에는
memcpy 를 사용하는 것이 더 좋습니다.

 

+ Recent posts