C11
和 C++14
标准已经取消了本质上不安全且容易导致安全问题的 gets()
函数,因为它没有执行边界检查,导致缓冲区溢出。那么为什么 C11
标准没有取消 strcat()
和 strcpy()
函数呢?strcat()
函数没有检查第二个字符串是否适合第一个数组。 strcpy()
函数也没有检查目标数组的边界。如果源数组中的字符数超过目标数组的容量,那么程序很可能在运行时崩溃。
既然这两个不安全的函数容易导致问题,完全将它们从语言中删除不是更好吗?为什么它们仍然存在?原因是什么?只保留像 strncat(),strncpy()
这样的函数不是更好吗?如果我没记错,微软的 C 和 C++ 编译器提供了这些函数的安全版本 strcpy_s(),strcat_s()
。那么为什么其他 C 编译器没有正式实现它们以提供安全性呢?
strncpy
和strncat
。 - Elliott Frischgets
永远不在程序员的控制之下,而strcpy
和strcat
可以在程序员控制长度并知道他们在做什么的情况下使用。 - nhahtdh