strcpy与memcpy

memcpy()和strcpy()有什么区别? 我试图find一个程序的帮助,但都给出了相同的输出。

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 

你可以看到“ch”被memcpy()复制,而不是strcpy()

strcpy在遇到NULL时停止, memcpy不会。 您在这里看不到效果,因为printf中的%s也停在NULL处。

当find源string的空终止符时, strcpy终止。 memcpy需要传递一个size参数。 在你提交printf语句的情况下,在为两个字符数组findnull终止符之后停止,但是你会发现t[3]t[4]也有复制的数据。

strcpy字符从源代码复制到目的地,直到在源代码中findNULL或“\ 0”字符。

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

作为memcpy从给定大小n的源到目的地复制数据(不是字符),而不考虑源中的数据。

如果你知道源包含字符以外的内容,应使用memcpy 。 对于encryption数据或二进制数据,memcpy是最理想的select。

strcpy已被弃用,所以使用strncpy

由于string中的空字符,printf将不会显示任何内容。 p和t之间的差别将是字符4和5. p不会有任何(他们将是垃圾),并且t将具有“c”和“h”。

主要区别在于memcpy()总是复制您指定的确切字节数; 另一方面,strcpy()会复制,直到它读取一个NUL(又名0)字节,然后停止。

  • 行为差异: strcpy遇到NULL'\0'时停止
  • 性能差异: memcpy通常比strcpy更高效,它必须扫描它所复制的数据