真正的原因:因为这些所谓“不安全”的函数是全平台广泛通用的。那些带_s的函数太商业化、带有铜臭。
先不谈各种嵌入式什么的,咱就说最常见的Intel CPU的电脑。
如果你装Windows系统,那么就有strcpy_s可用;如果你装Linux(包括win10/win11的Linux子系统)或苹果Mac OS系统,那么哪来的什么strcpy_s给你用?这边的安全版本函数是strlcpy。然而Windows又不给你用strlcpy函数。
其实,带_s的函数是微软自创的,它只在Windows环境有效,别的平台没法用。C11标准的Bound-Checking Interfaces向微软妥协,才在附录收了这些函数。
另一些微软自创的东西,比如“写void main、不用写return 0”,C标准不接受void main的写法,要求一定得是int main,但是也妥协为“main函数不写return 0则返回0”。
如果你用strcpy前,自己写代码判断源串有多长、目标有多大,难吗?
如果用scanf的%s、%c前,自己判断目标大小,难吗?
易如反掌。
所以哪有什么安全不安全?分明是商业化的借口而已。
因为你用的甚至都不是C语言的编译器,而是某个商业公司的C++编译器。
去拿个正规的C语言编译器编译一下试试吧,gcc还是clang都都行。然后你就没有疑问了。