c string string strncpy
问题描述:
我对strncpy函数感到非常沮丧。我做了这样的事情:c string string strncpy
char *md5S; //which has been assign with values, its length is 44
char final[32];
strncpy(final,md5S,32);
但不知何故的char final[]
长度后成为超过32个。
我应该在这里做什么?
答
你忘了留有余地空字符
char final[33];
strncpy(final,md5S,32);
final[32] = '\0';
答
如果您的输出缓冲区不够大而不能复制所有的源字符串和尾随NUL然后输出字符串不会NUL终止。
在你的情况下,MD5是33个字节,包括NUL,所以不复制NUL。当你读回字符串时,你正在读取缓冲区的末尾。
使最后33个字节变长,并且始终在使用strncpy时将NUL添加到目标中的最后一个字符。
int n = 32;
char *src = "some really really long, more than 32 chars, string."
char dst[n+1];
strncpy(dst, src, n);
dst[n] = '\0';
答
strncpy
如果源串是只要或大于n
字符不NUL-终止复制字符串。如果你有权访问它,你可以使用strlcpy
,这将NUL终止你。
而是执行此操作:
strncpy(dst, src, dstlen - 1);
dst[dstlen - 1] = '\0';
OR
strlcpy(dst, src, dstlen);
其中,对于字符数组,dstlen = sizeof(dst)
。
哦,对,非常感谢,不敢相信我花了这么多时间 – SamChen