百科问答小站 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 语言用 换行后就无法再回到上一行了吗? 
  C语言编译器哪个好用? 
  C++如何返回未知类型的空引用? 
  为什么读取连续内存没有比不连续的效率更高? 
  C语言仅凭自学能到什么高度? 
  C 语言自带函数返回值为指针类型的数组为什么不需要释放内存? 
  大家在计算机学习路上,都看过哪些神一般的书? 
  开源代码里某个函数很长,这种代码能否认为是好的? 
  C语言中while(a=10);和while(a==10);有什么区别? 
  为什么大学讲授 C 语言比讲授 C++ 的更多? 

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





© 2024-12-26 - tinynew.org. All Rights Reserved.
© 2024-12-26 - tinynew.org. 保留所有权利