关于scanf()
程序往往有输入和输出,于是scanf()
与printf()
就成了我们最早见到的函数之一。因为这几天问我关于这两个函数的问题的同学很多,这两个函数的方法又比较复杂,所以我写了一篇文档来详细介绍它们。本篇是关于scanf()
的。
函数原型
#include <stdio.h>
int scanf(const char *format, ...);
scanf 是 scan format 的缩写,意思是格式化扫描,也就是从键盘获得用户输入。scanf()函数包含在头文件stdio.h中。
format——格式控制字符串
format由三类字符组成:格式化说明符,空白符,非空白符。
格式化说明符
格式化说明符以%开头,代表要读入的数据的类型。下面给出常见的格式化说明符及其含义:
说明符 | 含义 |
---|---|
%c | 一个字符 |
%d | 十进制整数 |
%i | 十进制,八进制,十六进制整数 |
%o | 八进制整数 |
%x | 十六进制整数 |
%lld | long long 类型十进制整数 |
%s | 一个字符串 |
%f | 一个float 类型浮点数 |
%lf | 一个double 类型浮点数 |
%p | 一个指针 |
%u | 一个无符号十进制整数 |
%i
认为以0开头的数是八进制,0x开头的数是十六进制。例如078就不是一个合法输入,因为八进制下没有78这个数。
除了%c
以外的说明符在读入时都会忽略空格Space、制表符Tab、回车Enter等空白字符。
int x,z; float y; char ch1,ch2;
scanf("%d%c%f%c%x",&x,&ch1,&y,&ch2,&z);
Input:
5 4.5
7A
Result:
x=5,ch1=' ',y=4.5,ch2='\n',z=122
空白字符
空白字符会使scanf()函数在读操作中略去输入中的一个或多个空白字符,即空格Space、制表符Tab、回车Enter等等,直到第一个非空白符出现为止。
char ch1,ch2;
scanf("%c %c",&ch1,&ch2);
Input:
4
Result:
ch1=' ',ch2='4'
非空白字符
一个非空白字符会使scanf()函数在读入时剔除掉与这个非空白字符相同的字符。特别的,若想忽略字符'%'应该使用%%,因为%本身用于标志格式化说明符。
int x,y; x=y=-1;
scanf("%d%d",&x,&y);
Input:
5,6
Result:
x=5,y=-1
int x,y; x=y=-1;
scanf("%d,%d",&x,&y);
Input:
5,6
Result:
x=5,y=6
注意
需要注意的是,我们从键盘输入的任何文本都是字符/字符串而非数值,格式化字符串只是声明了这些字符代表的含义。
如果遇到了无法匹配的字符(比如读%d却遇到了一个字符',',读%i却读到078),则不会读入,读入光标停在此处,该scanf之后的数据也无法读入。
int x,y,z; char ch; x=y=z=-1;
scanf("%d%d",&x,&y);
scanf("%c%d",&ch,&z);
Input:
5,6
Result:
x=5,y=-1,ch=',',z=6
参数表
参数表决定了读入的数据将存放于何处。参数表中参数的数目应与格式化说明符的数目相等,它们按顺序一一对应。注意将读入的数据存放于变量中时需要在其前面加上取地址&。
取地址运算符&
&是一个单元运算符,&a的返回值是变量a的地址。scanf为什么要将地址作为参数呢?打个比方,快递员要给你送快速,你肯定会告诉他:“送到XX小区X号楼X门XXX”,而不是“送到XXX家里”,他也不知道你家在哪。scanf要把读进来的数据放到变量里,也是同样的道理。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步