scanf函数
上一节中我们讨论了,如何将整数,浮点数,字符串打印到屏幕上去。既然有输出,怎么能没有输入呢?这一节中,我们来介绍与printf相反的scanf函数。
scanf的功能是将键盘输入的字符串转换成整数、浮点数、字符或字符串。
1. scanf函数的使用公式
- scanf是一个变参函数。(参数的数量和类型不确定)
- scanf的第一个参数是字符串。
- scanf的第一个参数是需要输入的字符串以及需要被读取的占位符。
- scanf的后续参数,是依次被读取并赋值的变量地址。
- 占位符的类型和数量需要与后续的参数类型和数量对应。
#include
这里读者不必理解如何使用指针,只需要记住以下两条简单的规则:
- 如果用scanf()读取基本变量类型的值,在变量名前加一个&。
- 如果用scanf()把字符串去读到字符数组中,不要使用&。
![34402bf9-6a13-eb11-8da9-e4434bdf6706.png](http://p01.5ceimg.com/content/34402bf9-6a13-eb11-8da9-e4434bdf6706.png)
可以发现scanf是printf的逆向过程。注意,键盘输入的时候,必须要和scanf的第一个参数的字符串对应。也就是说,对于上面的代码输入必须是:
s
以下几个是错误的示范
1
视频演示
https://cpl.zhoushengjie.com/11_scanf/
TIPS:
如果你使用的是较新版本的Visual Studio,scanf这类函数会被认为是不安全的,编译器会抛出C4996错误,并建议你使用别的安全函数替代。
但是,目前我们并不想引入并讨论这一类安全函数。请将_CRT_SECURE_NO_WARNINGS加入预定义字符串,屏蔽不安全函数错误。
![36402bf9-6a13-eb11-8da9-e4434bdf6706.png](http://p01.5ceimg.com/content/36402bf9-6a13-eb11-8da9-e4434bdf6706.png)
添加步骤方式如下:
- 解决方案下,工程点右键,进入属性。
- 展开C/C++,选择预处理器。
- 点击预处理器定义【编辑】。
- 将_CRT_SECURE_NO_WARNINGS加入预处理定义。
视频演示
https://cpl.zhoushengjie.com/11_scanf/
2. 占位符
scanf的占位符规范和printf类似,但有些不同。请使用的时候,不要混淆了。scanf的占位符组成如下。
- 一个可选的最大字段宽度,用一个正的十进制整数表示。
- 一个可选的长度指定符。
- 必须的转换操作。
![38402bf9-6a13-eb11-8da9-e4434bdf6706.png](http://p01.5ceimg.com/content/38402bf9-6a13-eb11-8da9-e4434bdf6706.png)
3. 示例
short
4.scanf与printf的不同
- printf的后续参数不要加&,而scanf由于需要一个指针,所以需要加&。
- printf的参数由于比int小的变量会升级为int,这样数据仍然是完整的。仅比int大的需要额外指明长度指示符。
- scanf会将数据填充到对应的变量里去,必须指明被填充的对象是什么,用int来填充char很显然是错误的,所以必须明确指定长度指示符。例如%hhd用于char,%hd用于short。
5. 检查是否使用了错误的占位符
如果你使用了错误的占位符,得益于新版的编译器,你可以在warning中看到这些提示。
#include
![3a402bf9-6a13-eb11-8da9-e4434bdf6706.png](http://p02.5ceimg.com/content/3a402bf9-6a13-eb11-8da9-e4434bdf6706.png)
根据提示,更正为如下即可。
#include
6. scanf参数必须用&的原因
void
在这段代码中,变量a,b分别在main,和add变量中,那么,main中的a和b与add中的a和b是同一个变量吗?
显然不是,函数调用的时候,是把main中a,b的值,传递给了add中的a,b。 add中无论如何修改a,b。无法影响到main中的a,b。这里有个技巧,{}是变量作用域,在不同{}内的同名变量,是不相干的。
既然不管是否同名,用传递值的办法setToZero都无法影响main中的变量。
那么回到scanf中,它也无法影响到scanf外的变量,那是怎样修改scanf外面的变量的呢?
答案是,使用指针。指针就是一个变量的地址,有了这个地址就能找到这个变量,并且修改它的值。因此,scanf的参数,都用了&。传递的类型,都是指针类型。
![3c402bf9-6a13-eb11-8da9-e4434bdf6706.png](http://p02.5ceimg.com/content/3c402bf9-6a13-eb11-8da9-e4434bdf6706.png)
![3d402bf9-6a13-eb11-8da9-e4434bdf6706.png](http://p03.5ceimg.com/content/3d402bf9-6a13-eb11-8da9-e4434bdf6706.png)