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




  

相关话题

  如何对一个元素只有0和1的数组进行排序? 
  C 语言中字符串常量的好处在哪里? 
  在C源代码中, 无论出现多大的数, 都是有效的吗? 
  无码编程的思想是否值得推行? 
  如何理解编程语言中「流」(stream)的概念? 
  高频交易中C++和Python的速度差异有多少? 
  为什么大学讲授 C 语言比讲授 C++ 的更多? 
  C++的CRTP所带来的静态多态功能具体有什么用? 
  C语言里a>b?a<c?a:b:c;这个怎么该判断? 
  Visual Studio 2019可以用来玩C语言吗? 

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





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