我当前正在学习C语言中的字符串,并且出现一个问题:为什么C开发人员不使strncpy null自动终止?
例如在strncpy的实现中,为什么不使用C语言的人添加以下行:
// dest denotes the destination string
dest[n - 1] = '\0';
为了使strncpy更安全?
答案 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)
它是通过这种方式完成的,因为您可能只想覆盖句子的前几个词。