【问题标题】:C Reason why strncpy not have null termination [closed]C为什么strncpy没有空终止的原因[关闭]
【发布时间】:2019-07-09 19:52:27
【问题描述】:

我目前正在学习 C 中的字符串,出现了一个问题:为什么 C 开发人员不让 strncpy null 自动终止?

比如strncpy的实现,为什么做C语言的人不加这行:

// dest denotes the destination string

dest[n - 1] = '\0';

为了让 strncpy 更安全?

【问题讨论】:

  • 这是一个选择,你也可以问为什么puts添加了最后一个换行符而不是fputs等等
  • 不是每个设计决策都有一个能让每个人都满意的解释。有strlcpyFWIW,但是不标准……
  • 因为 strncpy 用于您可能希望以 0 结尾的情况,例如仅覆盖字符串的一部分。
  • 您如何确定您无法复制您想要复制的源缓冲区的整个长度?如果目标缓冲区中的最后一个字符不为空,那么您就知道副本不完整。

标签: c string strcpy strncpy


【解决方案1】:

strncpy 从来没有打算成为strcpy 的“安全替代品”,尽管这是许多新的 C 程序员得到的印象,因为它确实需要一个“大小”参数。第三个参数是要从源缓冲区读取的字符数,而不是目标缓冲区的最大容量。

今天很少有使用案例strncpy 是将数据从一个缓冲区复制到另一个缓冲区的最佳选择。如果您确实需要strcpy 的安全替代品,您可以像这样使用snprintf

snprintf(dest, len_dest, "%s", src);

【讨论】:

【解决方案2】:

如果您没有达到计数,它会以空值终止。请参阅下面的报价 (https://en.cppreference.com/w/c/string/byte/strncpy)

复制最多count个字符指向的字符数组 src (包括终止空字符,但不包括任何 空字符后面的字符)指向字符数组 到目的地。

只有在终止空字符之前达到 count 才会终止。您不能在容量上添加终止空字符,因为这将超出数组范围。

您可能想查看strlcpy,它会做您想做的事,但不是标准库的一部分。

【讨论】:

  • 刚刚添加。
  • OP 想知道为什么它是这样写的。
【解决方案3】:

这样做是因为您可能只想覆盖句子的第一个单词。

【讨论】:

    猜你喜欢
    • 2010-11-30
    • 1970-01-01
    • 2020-07-19
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多