c字符串拷贝与strncpy

时间:2011-09-23 00:28:16

标签: c string

我对strncpy功能感到非常沮丧。我做了这样的事情:

char *md5S; //which has been assign with values, its length is 44
char final[32];
strncpy(final,md5S,32);

但不知怎的,char final[]的长度超过了32 我该怎么办?

3 个答案:

答案 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';