百科问答小站 logo
百科问答小站 font logo



既然scanf和strcpy等函数会被编译器报不安全,那么C语言教材为什么还讲这些函数? 第1页

  

user avatar   zhan-qi-lai-74-48 网友的相关建议: 
      

真正的原因:因为这些所谓“不安全”的函数是全平台广泛通用的。那些带_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前,自己判断目标大小,难吗?

易如反掌。

所以哪有什么安全不安全?分明是商业化的借口而已。


user avatar   pansz 网友的相关建议: 
      

因为你用的甚至都不是C语言的编译器,而是某个商业公司的C++编译器。

去拿个正规的C语言编译器编译一下试试吧,gcc还是clang都都行。然后你就没有疑问了。




  

相关话题

  在不使用奇淫怪技的情况下, 如何写出比 STL 快的 vector? 
  如何以最小的改动尽量不改变已有代码的情况下适应不断变更的需求? 
  C++ 对 c 兼容是什么意思? 
  自学计算机,打印沙漏研究俩小时还有希望么? 
  如何滴水不漏的学完C语言? 
  面向对象中,平行继承体系是否尽量完全抛弃? 
  C++的优势有哪些? 
  为什么一个字节定义成8位? 
  内存为啥要分堆栈在编程里,要是全部只用堆或者全部只用栈,行不行? 
  C语言中while(a=10);和while(a==10);有什么区别? 

前一个讨论
dcdc电路完成恒压和恒流两种工况,为什么使用电压电流双闭环,而不是用分别使用电压环和电流环控制?
下一个讨论
树莓派raspberry pi关闭中国工厂,由英国工厂进行生产,对国产开源硬件厂商是不是一个机会呢?





© 2024-11-28 - tinynew.org. All Rights Reserved.
© 2024-11-28 - tinynew.org. 保留所有权利