百科问答小站 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都都行。然后你就没有疑问了。




  

相关话题

  C++ 中,如果指针换了被指向的东西,那被指向的原来的东西(是被 new 出来的)所占的内存会立刻被释放吗? 
  C++ 无法取代 C 吗? 
  C/C++ 数组大小需要是2的倍数吗? 
  如果穿越成1972年的Dennis Ritchie,你会怎样重新设计C语言? 
  C++ 是否适合做 GUI? 
  编译器在遇到指向基类的指针时都会进行动态联编吗? 
  谭浩强在程序员圈子里的口碑如何?为什么? 
  请问如何区分c语言中float和double的用法? 
  英语不好能学C语言和C++么? 
  是 C++ 的发展进入了邪路,还是我写代码的姿势不正确? 

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





© 2024-06-02 - tinynew.org. All Rights Reserved.
© 2024-06-02 - tinynew.org. 保留所有权利