strcpy vs. memcpy
와의 차이는 무엇입니까?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]
strcpyNUL이 검출되면가 정지합니다('\0')의 문자,memcpy하지 않다.여기서는 그 효과를 볼 수 없습니다.%sin printf도 NUL에서 정지합니다.
이 효과를 보기 위해 할 수 있는 일
다음 코드를 컴파일하여 실행합니다.
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().
가장 큰 차이점은 이다.memcpy()는 항상 지정한 바이트의 정확한 수를 복사합니다.strcpy()한편, 는 NUL(일명 0) 바이트를 읽을 때까지 복사한 후 정지합니다.
테스트 프로그램의 문제는printf()의론의 삽입을 그만두다%snull-termination이 발생했을 경우\0출력에서는 아마 눈치채지 못하셨을 겁니다.memcpy()글자를 베꼈다c그리고.h뿐만 아니라.
GNU에서 본 적이 있다glibc-2.24, 그거 (x86의 경우)strcpy()그냥 전화하다memcpy(dest, src, strlen(src) + 1).
- 동작 차이:
strcpy를 만나면 정지합니다.NULL또는'\0' - 퍼포먼스 차이:
memcpy통상, 보다 효율적입니다.strcpy복사한 데이터를 항상 스캔합니다.
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;
}
strcpy소스 문자열의 늘 터미네이터가 발견되면는 종료됩니다. memcpysize 파라미터를 전달해야 합니다.제시하신 경우printf양쪽 문자 배열에 대해 null 터미네이터가 발견된 후 문이 중지됩니다만,t[3]그리고.t[4]그 안에 데이터도 복사되어 있습니다.
strcpy는 소스 내에서 NULL 또는 '\0' 문자를 찾을 때까지 문자를 소스 간에 하나씩 복사합니다.
while((*dst++) = (*src++));
반면에.memcpy는, 소스내의 데이터에 관계없이, 소정의 사이즈n 의 송신원으로부터 수신처에 데이터(문자가 아님)를 카피합니다.
memcpy소스에 문자 이외의 것이 포함되어 있는 것을 잘 알고 있는 경우는, 을 사용해 주세요.암호화된 데이터 또는 바이너리 데이터의 경우 memcpy가 이상적인 방법입니다.
strcpy권장되지 않으므로 사용strncpy.
의 null 문자가 원인이 되어 있습니다.s문자열,printf그 외에는 아무것도 보여주지 않을 거예요.의 차이점p그리고.t문자 4와 5로 표시됩니다. p(쓰레기가 될 것)도 없고t을 가질 것이다.'c'그리고.'h'.
언급URL : https://stackoverflow.com/questions/2898364/strcpy-vs-memcpy
'programing' 카테고리의 다른 글
| 코드 분할 vuex 응용 프로그램 (0) | 2022.08.03 |
|---|---|
| Java에서 순차 정수 목록 또는 배열을 생성하려면 어떻게 해야 합니까? (0) | 2022.08.03 |
| VueJS - 패스 함수명과 콜의 차이 (0) | 2022.08.03 |
| bind()를 호출할 때 sockaddr_in을 sockaddr에 캐스팅하는 이유는 무엇입니까? (0) | 2022.08.03 |
| 클릭 리스너 포함 Renderless Vue 구성 요소 (0) | 2022.08.03 |