scanf函数详解(基础)

简述:scanf是scan format的缩写,意思为格式化扫描。scanf()函数用于读取用户的键盘输入,它的原型定义在头文件stdio.h里。

scanf函数处理⽤⼾输⼊的原理是,⽤⼾的输⼊先放⼊缓存,等到按下回⻋键后,再根据占位符对缓存进⾏解读。解读时,它会从上⼀次解读所遗留的第⼀个字符开始,直到读完缓存,或者遇到第⼀个不符合条件的字符为⽌。

1:函数原型及理解

int scanf ( const char * format, … );

1.1:参数

参数一:格式字符串,里面会放置占位符。

它告诉编译器如何解读用户的输入,需要提取的字符是什么类型。

1.空白格式符

该函数将读取并忽略在下一个非空白字符之前遇到的任何空白字符(包括空格’ ‘,制表符’\t’,换行符’\n’)。
在c语言中,scanf 函数默认会跳过空白字符,但在使用 %c 格式说明符时,scanf 会读取输入流中的下一个字符,包括空白字符。为了防止 %c 读取空白字符,可以在 %c 前添加一个空白字符(空格),这样 scanf 会跳过空白字符并读取下一个非空白字符
举例:

char c;
scanf(" %c", &c);
printf("%c\n", c);

在这里插入图片描述

再者:

int a, b;
printf("请输入两个整数:");
scanf("%d %d", &a, &b); // 格式字符串中的空格匹配任意数量的空白字符
printf("a = %d, b = %d\n", a, b);

在这里插入图片描述
//反之,若scanf() 的格式存在多个空格,而我们输入的数据只有一个空格的时候,数据依然可以正常被识别并读取。

2.非空白字符,格式说明符 (%) 除外

任何不是空格字符(空白、换行符或制表符)或格式说明符(以 % 字符开头)的字符都会导致函数从流中读取下一个字符,将其与此非空白字符进行比较,如果匹配,则丢弃该字符,函数继续使用 format 的下一个字符。如果字符不匹配,则函数失败,返回流的后续字符并使其处于未读状态。

举例理解:

int a, b;
scanf("%d,abc%d", &a, &b); // 格式字符串中的",abc"必须匹配输入中的",abc"
printf("a = %d, b = %d\n", a, b);

在这里插入图片描述
在这里插入图片描述
解释:第一次我们在10与20之间输入了",abc",它们依次与非空白字符完全匹配,函数读取后进行丢弃,之后%d正常读取后面的20。
第二次相比于第一次我们少了’c’,当函数读取丢弃完’b’之后,发现下一个字符并不匹配,则函数读取失败,保留变量原来的值。//此处因为未给变量b进行初始化,储存的是一个随机的值。

3.格式说明符

由初始百分号 (%) 组成的序列表示格式说明符,用于指定要从流中检索并存储到其他参数所指向的位置的数据的类型和格式
有以下类型:

格式说明符 用途 解释
%d 用于输入输出有符号十进制整数 %d 会将整数以十进制形式输入输出,适用于 int 类型
%i 与 %d 类似,但在某些情况下有细微差别 %i输入支持十进制、八进制和十六进制,输出为十进制,适用于int类型
%u 用于输出无符号十进制整数 %u 会将整数以无符号十进制形式输出,适用于 unsigned int 类型
%o 用于输出无符号八进制整数 %o 会将整数以八进制形式输出,适用于 unsigned int 类型
%x / %X 用于输出无符号十六进制整数 %x 以小写字母输出十六进制数,%X 以大写字母输出十六进制数,适用于 unsigned int 类型
%ld 用于输出有符号长整数 %ld 会将长整数以十进制形式输出,适用于 long 类型
%lld 用于输出有符号长长整数 %lld 会将长长整数以十进制形式输出,适用于 long long 类型
%f 用于输出单精度浮点数 %f 会将浮点数以小数形式输出,适用于 float 类型
%lf 用于输出双精度浮点数 %lf 会将双精度浮点数以小数形式输出,适用于 double 类型
%e / %E 用于输出科学计数法表示的浮点数 %e 以小写字母输出科学计数法,%E 以大写字母输出科学计数法,适用于 float 和 double 类型
%g / %G 用于自动选择 %f 或 %e 输出浮点数 %g 会根据数值大小自动选择小数形式或科学计数法(小写),%G 同理(大写),适用于 float 和 double 类型
%c 用于输出单个字符 %c 会将字符输出,适用于 char 类型
%s 用于输出字符串 %s 会将字符串输出,适用于 char* 类型
%p 用于输出指针地址 %p 会将指针的地址以十六进制形式输出,适用于 void* 类型
%n 用于将已写入的字符数存储到指定变量中 %n 会将当前已输出的字符数存储到对应的 int* 类型变量中
其余参数

它的其余参数就是存放⽤⼾输⼊的变量,格式字符串⾥⾯有多少个占位符,就有多少个变量。

1.2:返回值

scanf函数返回值的类型是int,表示成功读取并赋值的输入项的数量,以下是返回值的几种情况:

1.成功读取的项数

举例:

int a, b;
int result = scanf("%d %d", &a, &b);//此时

若输入10 20,则 result = 2(成功读取两个整数)
若输入10 abc,则 result = 1(成功读取一个整数)
若输入abc,则 result = 0(未能读取任何项)

2.返回常量EOF(-1)

遇到文件结束(End Of File)或输入错误(如用户按下 Ctrl+D 或 Ctrl+Z)。
举例:

int num;
int result = scanf("%d", &num);
printf("result = %d\n", result);

若在vs环境里连按三次Ctrl+Z结束输入,则 result = -1
在这里插入图片描述

2.注意

  • scanf()函数的变量前会带一个取地址运算符&,其会获取变量在内存中的地址。scanf()函数会根据地址找到为变量a分配的内存并将读取成功的数据写入到内存当中(以二进制的形式)。
  • 输入格式要与参数一格式字符串的格式相匹配。
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐