【发布时间】:2013-07-21 19:56:35
【问题描述】:
关于 C 的起源,我尝试了解一些东西,为什么有些函数不建议在大多数 SO 问题中使用。像strtok 或strncpy 一样,使用它们根本不安全。在任何地方,我都会看到建议编写自己的实现。为什么标准不会将 strncpy 更改为例如 BSD strlcpy,而是留下这些“怪物”?
【问题讨论】:
-
“我在任何地方都看到了编写我自己的实现的建议”——不要相信他们。
strtok() -> strtok_r(),strncpy() -> memcpy(),随便。原因#1:向后兼容。原因 #2:C 标准库是标准化的(令人惊讶),但没人关心。相反,操作系统和工具链供应商不断推出自己的扩展。 -
如果您了解它们的特定故障或限制,它们中的许多都可以很好地使用。例如
strtok不是线程安全的,但如果你只是简单地编写一个单线程程序,那没问题。同样,strncpy可能是“不安全的”,但可以与定义明确的输入一起使用。关键是要了解为什么某些功能已被替换或弃用。跟随 libc 等库的发展,您可以学到很多东西。 -
strncpy的问题不是“定义明确的输入”的问题,而是该函数不适用于将字符串复制到其他字符串。strncpy()的目的是将字符串复制到 空填充的固定大小缓冲区。不是“空终止”,而是“空填充”。副本的目标不是字符串,它是一个固定大小的缓冲区。因此,如果您了解自己在做什么,strncpy()使用起来是完全安全的,人们会告诉您“不推荐”的原因是它往往被误用作strcpy()的更安全替代品,但事实并非如此.
标签: c string standards history