代码之家  ›  专栏  ›  技术社区  ›  Jay

传递给strncat的计数值中存在疑问

  •  0
  • Jay  · 技术社区  · 14 年前

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

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

    很抱歉,如果问题看起来太小,但我无法从strncpy的帮助文档中找到答案。

    5 回复  |  直到 14 年前
        1
  •  1
  •   martinwguy    14 年前

    斯曼猫

    If src contains n or more characters, strncat() writes  n+1  characters
    to  dest  (n  from src plus the terminating null byte).  Therefore, the
    size of dest must be at least strlen(dest)+n+1
    
    $
        2
  •  3
  •   unwind    14 年前

    你应该只是 read the man page 再多一点。有效的判决似乎是这样的:

    strncat()函数类似, 但最多使用n SRC中的字符。因为结果 始终以“0”结尾,位于 大多数n+1字符是写的。

        3
  •  2
  •   Doug T.    14 年前

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

        4
  •  2
  •   danben    14 年前

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

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

        5
  •  1
  •   t0mm13b    14 年前

    简单的答案是:确保缓冲区足够大,如果缓冲区要容纳10个字符,请在缓冲区的大小上添加一个以适应nul字符。 \0 . 这是不可能被足够强调的,也是学习C的最大障碍之一。

    如果没有指定适当的长度(不包括nul字符),则会发生缓冲区溢出和不可预测的结果,例如程序崩溃,或者跳到永远看不到的树林中。

    希望这有帮助, 最好的问候, 汤姆。