文章目录
- scanf 函数
- 定义
- 功能
- 调用格式
- 常见的格式化说明符
- scanf函数的返回值
- 注意事项
1.定义
scanf()函数是一种格式输入函数,也就是按照用户在键盘上所输入的数据传入到提前定义的变量中。和下文中printf()函数一样,都被包含在<stdio.h>这一文件中,所以用户在使用前都应该c文件的最前端加入#include <stdio.h>语句。
(下图是在Linux函数中程序员手册对其的格式要求)
在该格式中,括号内统称为字符串常量,const char代表形式参数类型,char*为字符型变量的地址,即字符串中首个字符的地址,format为形式参数名,最后的...为变参(可填可不填)。该函数返回值为int型,此处int为用户有效的输入个数。
2.功能
实现格式化输入
3.调用格式
scanf(格式控制,地址表列);
格式控制中存在两种形式:
至于为什么在scanf函数中不能像printf函数中一样直接输出变量,而是需要进行取地址操作,
原因是在C语言中,默认传参为值传递,会在内存中开辟新的内存空间拷贝变量值,但并不会对原有变量的值进行改变。在进行C程序的编写中,一般main为主函数,在主调函数中,被调函数无法修改主调函数中变量的值,而scanf函数属于指针传参,是先获取了主调函数中变量的地址,从而对主调函数中的变量地址进行访问再对其内部数据进行修改。
注:仅通过地址无法知晓内存空间的大小
4.常见的格式化说明符
5.scanf函数的返回值
scanf函数的返回值为int类型,此处的int型为用户在输入时的有效输入位数
代码示例如下:
结果如下:
6.注意事项
a.在格式化列表中(在双引号中),写入的普通字符或者格式说明在终端中使用时,用户输入需要按照语句中的原式输入
错误示例如下:
所得结果:
b.在使用scanf过程中,若不对变量进行&取地址操作,在Linux系统中会造成程序崩溃
错误示例如下:
所得结果:
c.在使用scanf函数中会存在缓冲区的问题
在C语言中,用户调用scanf函数进行输入时,系统会开辟一个缓冲区,该缓冲区在数据结构中的类型是先进先出的队列,输入的数据会按照先进先出的原则在缓冲区进行保存。
错误示例如下:
可以看到,输入的1被同为整形的变量input1所接受打印,而后方所打印的字符串输出的是来自定义中input2所被系统赋予的随机数,这是因为所输入类型和格式化类型不匹配,那么输入的字符串是否被系统销毁了呢?实际上不是的,输入的字符串被保存在了缓冲区中。所以,如果数据不符合输入格式,则scanf()函数会读取失败,不再寻找输入缓冲区中后面的数据,不再等待用户输入新的数据,(即该scanf()函数调用结束),但不符合格式的数据依然保留在缓冲区中。