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




  

相关话题

  对于一个大一计科新生,有什么代码行数在 500~1000 的程序(C 语言)可以试着写来练手? 
  C语言编译器哪个好用? 
  C语言 乘以0.01快?还是除以100快? 
  i=1,为什么 (++i)+(++i)=6? 
  C++ 对 c 兼容是什么意思? 
  DOS 界面是如何制作的? 
  链表求交集,从链表头删去一长串而非一个节点?(已解决)? 
  如何将C语言的一段代码转换为javascript形式? 
  我有个同学说C语言太低级了,没有易语言强大好用。请问我该如何反驳? 
  有一台不会坏掉的电脑,这台电脑上只有vc++6.0,给一个人一亿年的时间,能创造出现在的各种软件吗? 

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





© 2025-04-04 - tinynew.org. All Rights Reserved.
© 2025-04-04 - tinynew.org. 保留所有权利