strncpy()字符串长度输出错误

时间:2011-11-21 05:52:27

标签: c string strncpy

我遇到问题strncpy()在我需要的时间内复制一个额外的字符。我需要将10个最高有效位从一个字符串复制到另一个字符串(均为char*格式)。

较大变量的大小并不直观重要,较小的变量仅在输出明显小于我需要的值时影响输出(我不知道为什么会这样)。

我的strncpy()中的n值可能是导致问题的原因,但我不知道为什么它的行为方式如此。如果我没有弄错,n,目标字符串的长度应该比数据长1,以便在结尾处考虑空字符。

我的字符串根本不是这样的。将n设置为11,我会收到以下输出:

00000111101100100100001110100000

00000111101

我认为它只会复制10个字符,最后一个字符为null。增加n会产生相同的结果。

将n减少到10揭示了问题的核心:

00000111101100100100001110100000

0000011110@

我不知道为什么会这样做,但是当n减小时它会继续这样做,直到n小得多(大约8)。

这些是我的代码的相关行:

char line[11], hexAddr[8], binAddr[33], lv1Index[11];
    ...
strncpy(lv1Index, binAddr, 10);

其中lv1Index在此之前未被触及,并且事先直接显示(在给定输出中)binAddr。

添加的字符总是@,所以我不相信它是lv1Index预初始化后的垃圾。

1 个答案:

答案 0 :(得分:3)

来自one C++ reference

  

如果在复制num个字符之前找到了源C字符串的结尾(由空字符表示),则用零填充目标,直到写入总共数个字符为止。

     

没有空字符隐式附加到目标的末尾,因此如果源中的C字符串的长度小于num,则目标将仅以空值终止。

其他文档(MSDNman page)也有类似的信息。

这意味着你应该把null终结符放在自己身上:

 lv1Index[10] = '\0';