scanf 是 C 语言标准输入函数,定义在 stdio.h 头文件当中,作用是从标准输入也就是键盘读取用户输入的数据,按照格式控制字符串的规则,把读取到的数据存入后面变量对应的内存地址,核心特点是必须传入变量地址,也就是一般要搭配取地址符 &,它可以读取整数浮点数字符字符串等多种类型,是 C 语言入门最基础的输入函数,很多初学者最常见错误就是忘记加 &,导致程序崩溃或者读取失败。
scanf 能够实现格式化输入,依靠格式符来识别输入数据类型,常用格式符包括 d 读取整数 f 读取单精度浮点数 lf 读取双精度浮点数 c 读取单个字符 s 读取字符串,格式控制串里面普通字符需要用户原样输入匹配,如果格式串里面写了逗号空格,用户输入的时候也必须输入对应的符号,否则匹配失败,函数执行之后会返回成功匹配的数据项个数,如果输入不匹配,返回值会小于预期数量,可以利用这个返回值判断输入是否合法。
基础使用步骤
第一步 引入头文件,代码开头写 include stdio.h
第二步 定义需要接收数据的变量,比如 int a float b
第三步 编写 scanf 语句,书写格式控制字符串,后面跟上变量地址
第四步 运行程序,等待键盘输入,输入完成按下回车提交数据
第五步 接收数据之后,继续执行后续代码,打印或者运算读取到的值
常用格式符对照表
格式符 作用 对应变量类型
d 读取十进制整数 int
f 读取单精度浮点数 float
lf 读取双精度浮点数 double
c 读取单个字符 char
s 读取字符串 char 数组
x 读取十六进制整数 int
o 读取八进制整数 int
基础代码示例
读取单个整数
scanf d 加上取地址 a
读取多个整数
scanf d d 加上取地址 a 取地址 b
读取浮点数
scanf lf 加上取地址 x
重点易错点
读取普通变量必须写 &,字符串数组本身就是首地址,不需要再加 &
格式串里面的空格逗号会强制要求用户输入对应符号,例如 scanf d 逗号 d,输入的时候必须写成 10 逗号 20
使用 c 读取字符的时候,回车换行符会被当成字符读入,容易出现吞字符问题,一般可以在格式符前面加空格跳过空白字符
输入类型不匹配的时候,输入缓冲区会残留错误数据,后续 scanf 读取会连续出错,需要清空缓冲区
补充拓展
scanf 和 printf 是配对函数,printf 负责输出,scanf 负责输入,两者格式符大部分相似,但是 double 类型在 printf 可以用 f,scanf 必须使用 lf,这是高频考点。
综合掌握 scanf 的用法,核心就是理解地址传参 格式匹配 缓冲区这三个关键点,写代码的时候优先检查 & 符号,确认格式符和变量类型匹配,理解格式串普通字符的匹配规则,就可以避开绝大多数 scanf 的用法错误。
【常见问题】
问题 1 scanf 的用法里面为什么变量前面要加 &
回答 1 scanf 的用法要求传入变量内存地址,函数需要把输入数据写入指定地址,普通 int float double 变量必须加取地址符 &,这是 scanf 的用法核心规则。
问题 2 scanf 的用法读取 double 为什么不能用 f
回答 2 scanf 的用法规定 double 类型必须使用 lf 格式符,如果误用 f 会出现读取异常,这是 scanf 的用法和 printf 不一样的地方。
问题 3 scanf 的用法读取字符为什么会吞掉回车
回答 3 scanf 的用法当中 c 格式符会读取所有字符包括回车换行,上一次输入留下的换行残留在缓冲区,下一次 scanf 的用法执行时就会直接读取换行,造成吞字符现象。
【免责申明】
以上内容为 C 语言语法学习参考,不同编译器在缓冲区处理细节上可能存在细微差异,实际开发请结合编译器文档测试验证。


