strcpy 대 memcpy


81

memcpy()과 의 차이점은 무엇입니까 strcpy()? 나는 프로그램의 도움으로 그것을 찾으려고했지만 둘 다 동일한 결과를 제공하고 있습니다.

int main()
{
    char s[5]={'s','a','\0','c','h'};
    char p[5];
    char t[5];
    strcpy(p,s);
    memcpy(t,s,5);
    printf("sachin p is [%s], t is [%s]",p,t);
    return 0;
}

산출

sachin p is [sa], t is [sa]

답변:


127

이 효과를보기 위해 할 수있는 일

이 코드를 컴파일하고 실행합니다.

void dump5(char *str);

int main()
{
    char s[5]={'s','a','\0','c','h'};

    char membuff[5]; 
    char strbuff[5];
    memset(membuff, 0, 5); // init both buffers to nulls
    memset(strbuff, 0, 5);

    strcpy(strbuff,s);
    memcpy(membuff,s,5);

    dump5(membuff); // show what happened
    dump5(strbuff);

    return 0;
}

void dump5(char *str)
{
    char *p = str;
    for (int n = 0; n < 5; ++n)
    {
        printf("%2.2x ", *p);
        ++p;
    }

    printf("\t");

    p = str;
    for (int n = 0; n < 5; ++n)
    {
        printf("%c", *p ? *p : ' ');
        ++p;
    }

    printf("\n", str);
}

다음 출력이 생성됩니다.

73 61 00 63 68  sa ch
73 61 00 00 00  sa

"ch"가에 의해 복사 memcpy()되었지만 은 복사 되지 않았 음을 알 수 strcpy()있습니다.


1
안녕하세요, 게시물이 오래되었다는 것을 알고 있지만 이에 대해 두 가지 질문이 있습니다. 첫째- printf("%2.2x ", *p);왜 printf를 2.2로 제한 했습니까? 게다가 나는 점이 전혀 printf("%c", *p ? *p : ' ');보이지 않는다 ... 둘째-- 이 테스트는 실제로 무엇을 확인합니까? 만약 *p? 귀하의 답변에 미리 감사드립니다!
피터 Cerba

14
printf 문에서 "x"는 "베이스 16"을 의미합니다. "2.2"는 두 자리, 두 자리 만 의미합니다. *p시험 방법 : "당신이 널에 충돌하는 경우, 공간을 인쇄 할 수 있습니다."
egrunin 2012-08-30

85

strcpyNUL ( '\0') 문자를 만나면 중지됩니다 memcpy. %sprintf에서도 NUL에서 멈춘 것처럼 여기서는 효과를 볼 수 없습니다 .


2
@Sachin : 초기화 p하고 t(예를 들어 모든 공백) 뭔가에, 다음 복사 한 후, 비교 p[3]t[3]. 은 ( strcpy는) p[2]null 문자를 발견 한을 넘어 가지 않았지만 memcpy지시 된대로 5 개의 문자를 복사했습니다.
Cascabel

9
사소한 nit-pick : strcpy가 NUL 문자 (하나의 "L")를 만나면 중지됩니다. NULL (2 개의 "L")은 포인터가 유효한 개체를 가리 키지 않도록 보장하는 컴파일 시간 상수입니다.
Daniel Stutzbach

감사합니다. 답을 얻었습니다
Sachin Chourasiya

dest와 src가 겹치면 strcpy가 seg-fault를 던질까요?
Alcott 2011 년

12

strcpy소스 문자열의 null 종결자가 발견되면 종료됩니다. memcpy크기 매개 변수를 전달해야합니다. 경우에 당신은 선물 printf그러나 당신은 발견 할 것이다, 널 터미네이터는 모두 문자 배열에 대한 발견 한 후 문이 정지입니다 t[3]t[4]뿐만 아니라 그들의 데이터를 복사 한.


9

strcpy 원본에서 NULL 또는 '\ 0'문자를 찾을 때까지 원본에서 대상으로 문자를 하나씩 복사합니다.

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

여기서 as memcpy는 소스의 데이터에 관계없이 소스에서 지정된 크기 n의 대상으로 데이터 (문자 아님)를 복사합니다.

memcpy소스에 문자 이외의 내용이 포함되어 있음을 잘 알고있는 경우 사용해야합니다. 암호화 된 데이터 또는 바이너리 데이터의 경우 memcpy가 이상적인 방법입니다.

strcpy더 이상 사용되지 않으므로 strncpy.


3

s문자열 의 null 문자 때문에는 그 printf이상을 표시하지 않습니다. 차이 pt문자 4되며 5. p어떤 (그들은 수 있습니다 쓰레기)가되지 않고 t이있을 것이다 'c'하고 'h'.


2
  • 동작 차이 : strcpy가 발생할 때 멈추는 NULL또는'\0'
  • 성능 차이 : memcpy일반적으로 strcpy복사하는 데이터를 항상 스캔하는 보다 효율적입니다.

2

주된 차이점은 memcpy()항상 지정한 정확한 바이트 수를 복사 한다는 것입니다 . strcpy()반면에는 NUL (일명 0) 바이트를 읽을 때까지 복사 한 다음 그 후에 중지합니다.


1

테스트 프로그램의 문제 는 null-termination을 만나면에 printf()인수 삽입을 중지 한다는 것 입니다. 그래서 출력에 당신은 아마 것을 발견하지 않았습니다 문자를 복사 하고 뿐만 아니라.%s\0memcpy()ch

나는 GNU에서 본 glibc-2.24(x86 용)이 있음을, strcpy()단지 호출합니다 memcpy(dest, src, strlen(src) + 1).


0

printf("%s",...) null이 발생하면 데이터 인쇄를 중지하므로 두 출력이 동일합니다.

다음 코드는 strcpy과를 구분합니다 memcpy.

#include<stdio.h>
#include<string.h>

int main()
{
    char s[5]={'s','a','\0','c','h'};
    char p[5];
    char t[5];
    int i;
    strcpy(p,s);
    memcpy(t,s,5);
    for(i=0;i<5;i++)
        printf("%c",p[i]);
        printf("\n");
    for(i=0;i<5;i++)
        printf("%c",t[i]);

    return 0;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.