2011-11-21 94 views
1

我遇到strncpy()问题,需要按照我需要的长度复制一个额外的字符。我需要将10个最高有效位从一个字符串复制到另一个(均为char*格式)。strncpy()字符串长度输出错误

较大的变量的大小并不直观,而较小的只影响输出,当它显着小于我需要的值(我不知道这是为什么)。

我的strncpy()中的n值可能是导致问题的原因,但我不知道为什么它按照原样行事。如果我没有弄错,n,即目标字符串的长度,应该比数据长1,以便在最后说明空字符。

我的字符串没有这样的行为。设置n11,我收到以下输出:

00000111101100100100001110100000 

00000111101 

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

增大或减小n至10揭示了问题的心脏:

00000111101100100100001110100000 

[email protected] 

我不知道为什么它会做到这一点,但它仍然要做到这一点正下降,直到n小得多(约8)。

这些是我的代码的相关线路:

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

其中lv1Index是在此之前不动,并显示binAddr(在给定的输出)直接预先。

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

回答

3

one C++ reference

如果找到该源C字符串(这是由一个空字符信号发送)​​的端部num个字符已被复制之前,目的地被用零填充,直到总共NUM的字符已被写入。

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

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

这意味着你应该把空终止你自己:

lv1Index[10] = '\0'; 
+0

+1,而且,如果他知道原始字符串的长度超过10个字符,他应该使用'memcpy',而不是'strncpy' – Paulpro

+0

啊,好吧,我仍然不完全明白为什么一切都是这样发生的(为什么不同的n值改变了输出,看起来与目的地的大小无关),但是这解决了我的问题。谢谢! –