我对strncpy功能感到非常沮丧。我做了这样的事情:
char *md5S; //which has been assign with values, its length is 44
char final[32];
strncpy(final,md5S,32);
但不知怎的,char final[]
的长度超过了32
我该怎么办?
答案 0 :(得分:9)
您忘记为空字符留出空间
char final[33];
strncpy(final,md5S,32);
final[32] = '\0';
答案 1 :(得分:5)
strncpy
个字符一样长或更长,则 n
不会终止复制的字符串。如果您有权访问它,则可以使用strlcpy
,NUL将为您终止。
请改为:
strncpy(dst, src, dstlen - 1);
dst[dstlen - 1] = '\0';
OR
strlcpy(dst, src, dstlen);
其中,对于char数组,dstlen = sizeof(dst)
。
答案 2 :(得分:2)
如果输出缓冲区不够大,无法复制所有源字符串及其尾随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';