strcpy 대 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]
이 효과를보기 위해 할 수있는 일
이 코드를 실행하고 실행합니다.
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
"채널"에 의해 복사는 memcpy()
되었지만 은 복사 되지 않았 음본을 알 수 strcpy()
있습니다.
strcpy
NUL ( '\0'
) 문자를 만나면 중지 memcpy
됩니다. %s
printf는 NUL에서 멈춘 것처럼 여기서는 효과를 볼 수 없습니다 .
strcpy
소스 문자열의 null 종결자가 발견되면 종료됩니다. memcpy
크기 매개 변수를 전달해야합니다. 경우에 당신은 선물 printf
그러나 당신은 발견 할 것이다, 널 터미네이터는 모두 문자 배열에 대한 발견 한 후 문이 정지입니다 t[3]
및 t[4]
뿐만 아니라 그들의 데이터를 복사 한.
strcpy
원본에서 NULL 또는 '\ 0'문자를 찾을 때까지 원본에서 대상으로 문자를 하나씩 복사합니다.
while((*dst++) = (*src++));
여기서 as memcpy
는 소스의 데이터에 관계없이 소스에서 지정된 크기 n의 대상으로 데이터 (문자 아님)를 복사합니다.
memcpy
소스에 문자 이외의 내용이 포함되어 있음을 잘 알고있는 경우 사용해야합니다. 암호화 된 데이터 또는 바이너리 데이터의 경우 memcpy가 이상적인 방법입니다.
strcpy
더 이상 사용되지 않으므로 strncpy
.
s
문자열 의 null 문자 때문에는 그 printf
이상을 표시하지 않습니다. 차이 p
와 t
문자 4되며 5. p
어떤 (그들은 수 있습니다 쓰레기)가되지 않고 t
이있을 것이다 'c'
하고 'h'
.
- 동작 차이 :
strcpy
가 발생할 때 멈추는NULL
또는'\0'
- 성능 차이 :
memcpy
일반적으로strcpy
복사하는 데이터를 항상 스캔하는 보다 효율적입니다.
주된 차이점은 memcpy()
항상 지정한 정확한 바이트 수를 복사 한다는 것입니다 . strcpy()
반면에 NUL (일명 0) 바이트를 읽을 때까지 복사 한 다음 그 후에 중지합니다.
테스트 프로그램의 문제 는 null 종료를 만나면에 printf()
인수 삽입을 중지 한다는 것 입니다. 그래서 출력에 당신은 아마 것을 발견하지 않았습니다 문자를 복사 하고 뿐만 아니라.%s
\0
memcpy()
c
h
나는 GNU에서 본 glibc-2.24
(x86 용)이 있음을, strcpy()
단지 호출합니다 memcpy(dest, src, strlen(src) + 1)
.
참고 URL : https://stackoverflow.com/questions/2898364/strcpy-vs-memcpy
'ProgramingTip' 카테고리의 다른 글
단일 git 커밋에 대해 합의 사용자 재정의 (0) | 2020.11.06 |
---|---|
C #에서`default` 키워드를 사용하는 것은 무엇입니까? (0) | 2020.11.06 |
jQuery 애니메이션 스크롤 (0) | 2020.11.06 |
SpannableStringBuilder는 여러 글꼴 / 텍스트 크기 등으로 많은을 생성합니다. 예? (0) | 2020.11.06 |
Intellisense는 Visual Studio 2012의 JavaScript에서 작동하지 않습니다. (0) | 2020.11.06 |