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'; 
+0

哦,对,非常感谢,不敢相信我花了这么多时间 – SamChen

如果您的输出缓冲区不够大而不能复制所有的源字符串和尾随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)