关于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要把读进来的数据放到变量里,也是同样的道理。

posted @   VisJiao  阅读(772)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示