我试图考虑如何制作函数strncpy
,但遇到了这个问题。
char src[] = "123456789A";
char dest[10];
int n = 10;
printf("strncpy:%s\n", strncpy(dest, src, n));
输出
strncpy:123456789A123456789A
发生了什么事?
快速答案:strncpy
不是您的朋友!
strncpy
是not strcpy
的更安全版本,它将从n
复制最多src
个字符,如果src
较短,则将目标填充为空个字节,总计n
个字符。
如果源字符串包含n
个或更多字符,则目标数组将不以null终止,传递给printf("%s",
的将具有未定义的行为:printf
将继续读取和打印字节dest
结束后从内存中删除,直到找到空字节或直到此未定义的行为引起其他不可预测的副作用为止。]
strncpy
的语义是违反直觉的,并且容易出错,请避免使用此功能。详见本文:https://randomascii.wordpress.com/2013/04/03/stop-using-strncpy-already/
正如其他人所说的,如果目标大小与字符串长度相同,则strncpy
将不包含终止null。为了给您一个实用的答案,我通常只需要使用sizeof
从目标大小中减去一个即可得到目标大小,包括终止符的空间:
数组dest
不包含字符串,因为没有足够的空间来容纳复制的源字符串的终止零'\0'
,