【问题标题】:Doubt in count value passed to strncat怀疑传递给 strncat 的计数值
【发布时间】:2010-01-31 14:25:57
【问题描述】:

假设我有一个大小为 10 个字符的数组(memset 为 0),我将其作为目标传递给 strncat,并且在源代码中我传递一个长度为 20 个字符的字符串(以空字符结尾),现在我应该将“计数”传递为 10 还是 9?

问题是,strncpy 是否将“计数”视为目标缓冲区的大小,还是只是将 10 个字符复制到目标,然后在第 11 个位置附加一个 NULL 终止字符。

对不起,如果这个问题显得过于琐碎,但我无法从 strncpy 的帮助文档中弄清楚这一点。

【问题讨论】:

    标签: c string


    【解决方案1】:

    您可能应该只是read the man page 多一点。执行语句似乎是这样的:

    strncat() 函数类似, 除了它将使用最多 n 来自 src 的字符。由于结果 总是以 '\0' 结束,在 写了最多 n+1 个字符。

    【讨论】:

      【解决方案2】:

      strncat 将为您应用空终端。由于它不知道您指向的所谓字符串,因此它将假定空终端有空间。所以你想通过 9。

      【讨论】:

        【解决方案3】:

        如果您的数组只有 10 个字符的空间,那么您的计数应该是 9,因为 strncat 将尝试从 src 附加 count 字符加上一个空终止符。

        此外,在这种情况下,您的 destination 应该在第一个位置有一个空终止符,因为这是您需要它开始追加的位置。

        【讨论】:

          【解决方案4】:

          $ 人 strncat

          如果 src 包含 n 个或更多字符,则 strncat() 写入 n+1 个字符 到 dest(来自 src 的 n 加上终止的空字节)。因此, dest 的大小必须至少为 strlen(dest)+n+1 $

          【讨论】:

            【解决方案5】:

            简单的答案是:确保您的缓冲区足够大,如果您的缓冲区要容纳 10 个字符,请在缓冲区大小上加一个以容纳 nul 字符 \0。这怎么强调都不过分,是学习 C 的最大绊脚石之一。

            如果你没有指定适当的长度,不包括nul字符,缓冲区溢出和不可预知的结果会发生,比如程序崩溃,或者跳进树林再也见不到了。

            希望这会有所帮助, 最好的祝福, 汤姆。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2017-10-01
              • 2018-10-18
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多