简单记录一些字符串拷贝函数注意点,有错误和改进欢迎指出,随时更新。
memcpy
void *
MEMCPY (void *dstpp, const void *srcpp, size_t len);
严格遵照len的值进行拷贝,要注意两个指针的界限,遇到’\0’正常拷贝。
sprintf
用一个例子程序来说明一个注意点
int main(int argc, char* argv[])
{
char szMsgB[3] = {0};
szMsgB[0] = 0x01;
szMsgB[1] = 0x02;
szMsgB[2] = 0x03;
sprintf(szMsgB, "1");
for(int i=0; i<sizeof(szMsgB); i++)
printf("szMsgB[%d] = %x\n", i, szMsgB[i]);
return 0;
}
输出结果:
szMsgB[0] = 31;
szMsgB[1] = 0;
szMsgB[2] = 3;
sprintf会对目的地址写’\0’,后面的字节不操作,假如你还要操作尾巴,记得最后补’\0’。
strcpy
char *
STRCPY (char *dest, const char *src)
{
return memcpy (dest, src, strlen (src) + 1);
}
才看到glibc中是这么玩的,src指针跟到’\0’为止,要注意你的src有没有合理的’\0’,dest指向的存储区大小是否合理。
strncpy
char *
STRNCPY (char *s1, const char *s2, size_t n)
{
size_t size = __strnlen (s2, n);
if (size != n)
memset (s1 + size, '\0', n - size);
return memcpy (s1, s2, size);
}
从这个源码可以看出,严格按照n值操作,拷贝’\0’以前的,后面的全部写’\0’。
关于memcpy的glibc实现细节可以参考: