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
更高效,它必须扫描它所复制的数据