## Scanf函数基本概念
### scanf函数介绍
- scanf函数是一个阻塞式函数
+ 程序会停在`scanf`函数出现的地方, 直到接收到数据才会执行后面的代码
- scanf函数原型包含在标准输入输出头文件`stdio.h`中,用于接受键盘输入的内容。
+ 格式:scanf("格式控制字符串",输入项地址列表);
+ 例如: scanf("%d", &num);
+ 格式控制字符串:
* 规定数据输入的格式,由格式控制符和普通字符组成,格式控制符和百分号(%)一起使用,
用来说明输入数据的数据类型(格式字符)。
+ 输入项地址列表:
* 需要接收数据的变量地址,这些输入项与格式控制字符串在类型和数量上要对应,当有多个 输入项时,各个地址名之间以逗号“,”分隔。输入格式和变量类型要保持一致。
> 在C语言中,一个变量的地址可以通过地址运算符&得到。例如:定义int a,b;则a,b的 地址为&a,&b
### scanf函数格式控制符
|格式|意义|
|--|--|
|d|输入一个十进制整数|
|o|输入一个八进制整数|
|x|输入一个十六进制整数|
|i|输入一个有符号或无符号的十进制、八进制、十六进制整数|
|u|输入一个无符号十进制整数|
|f 、e或E、 g或G|输入一个小数形式或指数形式的浮点数|
|c|输入一个字符|
|s|输入一个字符串|
- 获取整形数据
```
// 1.定义变量用于接收输入数据
int num = 0;
// 2.利用scanf函数接收用户输入数据
scanf("%d", &num);
// 3.打印验证结果
printf("num = %d", num);
```
- 获取实数型数据
```
// 1.定义变量用于接收输入数据
float num = 0;
// 2.利用scanf函数接收用户输入数据
scanf("%f", &num);
// 3.打印验证结果
printf("num = %d", num);
```
- 非法的输入
+ 除"空格","回车","tab"之外, 如果输入的数据和scanf接收的数据不匹配将会自动结束接收
## Scanf函数注意事项
### scanf使用注意事项
- 如果在输入时,输入了多个空格、回车、Tab都会被系统忽略的
- 如果要获取的内容是多个整数,中间输入了多个空格、回车、Tab都会被系统忽略
- 如果要获取的内容是多个实型,中间输入了多个空格、回车、Tab都会被系统忽略
- 非法的格式输入,得不到想要的结果
- 混合整形和字符型数据接收
+ 当整形的数和字符混合输入时,要避免“空格” 添麻烦
+ 为防止混合输入空格造成的错误,可以通过添加普通的分隔符解决
- 关于使用"\n"的问题
+ scanf函数当遇到回车的时候,会结束执行
+ 所以在scanf中,尽量不要使用 \n
+ 如果在scanf中使用了\n, 需要原样输入"\n"
## Scanf函数实现原理
### scanf的运行原理
- 系统会将用户输入的内容了放入输入缓冲区
- scanf方式会从输入缓冲区中逐个取出内容赋值给格式符, 如果类型不一致不会修改原有数据
- 如果输入缓冲区的内容不为空,scanf会一直从缓冲区中获取,而不要求再次输入