先列出两个函数的原型
char *strncpy(char *dest,char *src,size_t n);
void *memcpy(void *dest, const void *src, size_t n);
如果只是操作字符串,其实这两个函数差别不大,类型转换都不是问题。
有一点差别就是当你要拷贝大于原字符串长度的时候,也就是 n 大于原字符串长度,strncpy 会用 '\0' 来填充,而 memcpy 则会在原字符串所在地址按照长度拷贝内存里的值,所以多余的字符是内存中不确定的值。
如果是在嵌入式编程里,差别就有点大了,而且也会容易疏忽这个问题。
嵌入式编程中常常使用十六进制数据,比如串口里不传输字符串,而是传输十六进制比特流。说到这你能想出两者的差别吗?
我要发送20个字节的16进制数,然后我可能还有个数据包头里面告诉你我传了20个字节。对方要把这20个字节拷贝到一个数组缓冲里面。
因为16进制流里难免出现0x00,如果用 strncpy 来拷贝数据,在出现0x00的地方就认为是字符串结束了,然后剩余的长度都会用0x00('\0') 填充。而memcpy就不会出现这个问题。
例
数据流: a1 a2 a3 a4 a5 a6 a7 a8 a9 00 b0 b1 b2 b3 b4 b5 b6 b7 b8 b9
用strncpy之后:a1 a2 a3 a4 a5 a6 a7 a8 a9 00 00 00 00 00 00 00 00 00 00 00
用memcpy之后:a1 a2 a3 a4 a5 a6 a7 a8 a9 00 b0 b1 b2 b3 b4 b5 b6 b7 b8 b9
网友评论