C为什么strncpy没有空终止

时间:2019-02-15 16:20:21

标签: c string strcpy strncpy

我当前正在学习C语言中的字符串,并且出现一个问题:为什么C开发人员不使strncpy null自动终止?

例如在strncpy的实现中,为什么不使用C语言的人添加以下行:

// dest denotes the destination string

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

为了使strncpy更安全?

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

如果未达到计数,则终止为null。请参见下面的引用(https://en.cppreference.com/w/c/string/byte/strncpy

  

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

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

您可能想研究strlcpy,它可以满足您的要求,但不属于标准库。

答案 2 :(得分:0)

它是通过这种方式完成的,因为您可能只想覆盖句子的前几个词。