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]
答案 0 :(得分:105)
可以做些什么才能看到这种效果
编译并运行此代码:
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 :(得分:66)
strcpy
遇到NULL时会停止,memcpy
则不会。你没有在这里看到效果,因为printf中的%s
也在NULL处停止。
答案 2 :(得分:12)
strcpy
终止。 memcpy
需要传递大小参数。如果您在两个字符数组找到空终止符之后显示printf
语句暂停,则您会发现t[3]
和t[4]
也在其中复制了数据。
答案 3 :(得分:9)
strcpy
逐个将字符从源复制到目标,直到它在源中找到NULL或'\ 0'字符。
while((*dst++) = (*src++));
其中memcpy
将数据(非字符)从源到目标复制给定大小为n,而不考虑源中的数据。
memcpy
。对于加密数据或二进制数据,memcpy是理想的方式。
strcpy
,因此请使用strncpy
。
答案 4 :(得分:3)
由于s
字符串中的空字符,printf
除此之外不会显示任何内容。 p
和t
之间的差异将在字符4和5中。p
将不会有任何内容(它们将是垃圾)而t
将具有'c'
1}}和'h'
。
答案 5 :(得分:2)
主要区别在于memcpy()
始终复制您指定的确切字节数;另一方面,strcpy()
将复制,直到它读取NUL(也称为0)字节,然后在此之后停止。
答案 6 :(得分:2)
strcpy
在遇到NULL
或'\0'
memcpy
通常比strcpy
效率更高,RFC connection options:
[...]
-2 SNA mode on.
You must set this if you want to connect to R/2.
[...]
-3 R/3 mode on.
You must set this if you want to connect to R/3.
始终扫描复制的数据答案 7 :(得分:0)
测试程序的问题是printf()
在遇到空终止%s
时停止将参数插入\0
。
因此,在您的输出中您可能没有注意到,memcpy()
也复制了字符c
和h
。
我在GNU glibc-2.24
中看到,(对于x86)strcpy()
只调用memcpy(dest, src, strlen(src) + 1)
。
答案 8 :(得分: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;
}