我目前正在学习C中的字符串,并且出现了一个问题:C开发人员为什么不使strncpy Null自动终止?
例如,在实施strncpy时,为什么没有制作C语言的人添加此行:
// dest denotes the destination string
dest[n - 1] = ' ';
为了使strncpy更安全?
strncpy
从未打算是 strcpy
的"安全替代",尽管这是许多新的C程序员获得的印象,因为它确实采用了"大小"参数。第三个参数是要从源缓冲区读取字符数,而不是目标缓冲区的最大容量。
今天,strncpy
是将数据从一个缓冲区复制到另一个缓冲区的最佳选择。如果您确实需要strcpy
的安全替代方案,则可以使用snprintf
这样:
snprintf(dest, len_dest, "%s", src);
这样做,因为您可能只想覆盖句子的第一个单词。
如果您不达到计数,则终止终止。请参阅下面的引文(https://en.cppreference.com/w/c/string/byte/strncpy)
在大多数计数字符数组的字符上复制 src(包括终止零字符,但没有任何一个 遵循null字符的字符)到字符阵列指向的字符 到dest。
只有在终止null字符之前达到计数时才没有终止。您不能以容量添加终止null字符,因为那将超出数组范围。
您可能想查看strlcpy
,它将执行您想要的工作,但不是标准库的一部分。