首页 > 其他 > 详细

scanf 和 scanf_s

时间:2015-08-11 21:16:00      阅读:253      评论:0      收藏:0      [点我收藏+]

  scanf 和 scanf_s

 

  • scanf()函数是标准C中提供的标准输入函数,用以用户输入数据
  • scanf_s()函数是Microsoft公司Visual Studio开发工具提供的一个与scanf()功能相同的安全标准输入函数

  从vc++2005开始,VS系统提供了scanf_s()。在调用该函数时,必须提供一个数字以表明最多读取多少位字符。

 

 

  原因和区别

 

  scanf()在读取数据时不检查边界,所以可能会造成内存访问越界:
  例如:分配了5字节的空间但是用户输入了10字节,就会导致scanf()读到10个字节

    char buf[5]={\0};
    scanf("%s", buf);

  如果输入1234567890,则5以后的部分会被写到别的变量所在的空间上去,从而可能会导致程序运行异常。


  以上代码如果用scanf_s()则可避免此问题:

    char buf[5]={\0};
    scanf_s("%s",buf,5); //最多读取4个字符,因为buf[4]要放‘\0‘ 

  如果输入1234567890,则buf只会接受前4个字符

  注: scanf_s最后一个参数n是接收缓冲区的大小(即buf的容量),表示最多读取n-1个字符.


  PS: 很多带“_s”后缀的函数是为了让原版函数更安全,传入一个和参数有关的大小值,避免引用到不存在的元素,防止hacker利用原版的不安全性(漏洞)黑掉系统。

 

 

  圆周率Pi

 

  tan(Pi/4)=1 => Pi=4*arctan(1)    

  反正切函数arctan()在C语言里表示为atan(),为保证精度取圆周率的代码如下(谨记):

 

    const double Pi = 4.0 * atan(1.0);

 

scanf 和 scanf_s

原文:http://www.cnblogs.com/eniac12/p/4722237.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!