首页 技术 正文
技术 2022年11月19日
0 收藏 764 点赞 3,123 浏览 1457 个字

前身——scanf()

有的教材里用的scanf(),其实在目前Visual Studio版本中已经弃用了,用scanf_s()函数代替了。

为什么现在要用scanf_s()

scanf_s()函数是Microsoft公司VS开发工具提供的一个功能相同的安全标准输入函数,从vc++2005开始,VS系统提供了scanf_s()。在调用该函数时,必须提供一个数字以表明最多读取多少位字符。另外,很多带“_s”后缀的函数是为了让原版函数更安全,传入一个和参数有关的大小值,避免引用到不存在的元素,防止hacker利用原版的不安全性(漏洞)黑掉系统。简单的理解,就是scanf_s会比scanf更安全,那么为了安全也需要编程者多传一些参数,这些参数就是变量的长度(占用的字节数)。

很多带“_s”后缀的函数是为了让原版函数更安全,传入一个和参数有关的大小值,避免引用到不存在的元素,有时黑客可以利用原版的不安全性黑掉系统。比如:char d[20];写成scanf_s(“%s”,d,20);才是正确的,有这个参数20使准确性提高。

注意事项

下列代码

double a,b,c;
scanf_s("%f%f%f",&a,&b,&c);
printf("%f%f%f",a,b,c);

打印结果:

512181,17989019,86000000

可以看到为3个随机数

为啥会这样呢?

scanf_s读%f时,系统会按照4字节长度来读,读完要放到一个4字节的空间位置,也就是一个float所在的位置。那么double有8字节空间,比4字节还大,能不能来放?答案是不能。因为float和double的关系不像int和long的关系那样,简单的在后面增加4字节的位置。float和double有自己专门的数据排列格式,如下:如果读的时候明明是按照float的格式来读,但是却存在double的空间内,并且之后一直按double来操作,那么里面数据的符号位、阶码、尾数就全错位了。除非你在用的时候把每个double强制转换成float来用,但是何必多次一举?同理,如果读用%lf来读,却存在float中,不仅格式错位,而且存储空间也不够,会有数据丢失。所以用scanf_s读的时候,读%f就规规矩矩的放进float中来存,读%lf就放进double中,这样在使用的时候里面的数据才不会错位。在printf的时候,首先C++里面的float其实在使用过程中都是被隐式转换成了double来用。所以你在printf时用float还是double其实是一样的。用%f和%lf都可以。

所以正确的写法是

double a,b,c;
scanf_s("%lf%lf%lf",&a,&b,&c);

总结

(1)printf的%f说明符既可以输出float型又可以输出double型。

根据“默认参数提升”规则(在printf这样的函数的可变参数列表中,不论作用域内有没有原型,都适用这一规则)float型会被提升为double型。因此printf()只会看到双精度数。

(2)scanf对于float类型必须用%f,double必须用%lf

对于scanf,情况就完全不同了,它接受指针,这里没有类似的类型提升。(通过指针)向float存储和向double存储大不一样,因此,scanf区别%f和%lf。

(3)事实上,printf中没有定义%lf,但是很多系统可能会接受它。要确保可移植性,就要坚持使用%f。

要想保留小数位数,请使用(比如保留8位小数):

printf("%.8f",a);
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,084
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,559
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,408
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,181
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,818
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,901