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이상을 표시하지 않습니다. 차이 p와 t문자 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.