【问题标题】:Strncpy() string length output errorstrncpy() 字符串长度输出错误
【发布时间】:2011-11-21 05:52:27
【问题描述】:

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

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

strncpy() 中的 n 值可能是导致问题的原因,但我不知道它为什么会这样。如果我没记错的话,目标字符串的长度 n 应该比数据长 1,以说明末尾的空字符。

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

00000111101100100100001110100000

00000111101

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

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

00000111101100100100001110100000

0000011110@

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

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

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

在此之前lv1Index 没有被触及,并且 binAddr 被直接显示(在给定的输出中)。

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

【问题讨论】:

    标签: c string strncpy


    【解决方案1】:

    来自one C++ reference

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

    没有空字符隐式附加到目标的末尾,因此只有当源中的 C 字符串的长度小于 num 时,目标才会以空字符结尾。

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

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

     lv1Index[10] = '\0';
    

    【讨论】:

    • +1,另外,如果他知道原始字符串的长度超过10个字符,他应该使用memcpy而不是strncpy
    • 啊,好吧,好吧,我仍然不完全理解为什么一切都以这种方式发生(为什么不同的 n 值会改变输出,似乎与目的地的大小无关),但这解决了我的问题。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-07
    • 1970-01-01
    • 2020-12-19
    • 2012-10-09
    • 2019-10-07
    相关资源
    最近更新 更多