一. scanf
1.基本用法:scanf() 读取用户的键盘输入 ----> 程序在运行到这个语句的时候,会停下来,等待用户从键盘输入。当用户输入数据之后按下回车,scanf() 就会处理用户的输入,将其存入变量。 scanf() 是库函数 ,其头文件是 <stdio.h>
(注:标准输入一般是键盘;标准输出一般是电脑屏幕)
原理:用户输入的数据会先放入缓存(内存区域),等按下回车键之后,按照占位符对缓存进行解读 。解读用户数据时,会从上一次遗留的第一个字符开始,直到读完缓存,或者遇到第一个不符合条件的字符开始。如下面代码:
上述代码,scanf() 读取用户输入时,%d 表示整型,所以 %d 占位符读到 123 便停止了,因为后面的 . 并不属于整数的有效类型。当第二次调用scanf() 时,缓存中还剩下 .456s ,%f 是浮点型,只读 0.456 ,到s 便会停止,因为 s 不属于浮点型的有效字符。
2.scanf() 的第一个参数是 格式字符串 ,里面会放置占位符,用来告诉计算机用户输入的数据类型,其后计算机才能处理这些数据(与printf() 的占位符相似)
可以同时输入多个数据,但是输入时的格式要与格式字符串中的格式保持一致。
请看下面代码:当数据连在一起的时候,计算机分辨不出这是一个数据还是多个数据,即使在格式字符串中"%d%d%d %d",但是数据之间要用空格(空白字符隔开)
空白字符隔开数据,计算机才知道数据是单独的
或者在知道单个数据数据的位数时(eg.个位)可以限制占位符的宽度
只有scanf() 在处理非%c 类型的数据时,会主动跳过、过滤掉空白字符,包括空格、制表符、换行符(即使按回车键将输入分为了几行,也不影响解读)等。
-->所以这也就是scanf() 不会读全带有空白字符的字符串的原因
除非搞多个scanf() 来读取
由上,我们可以得到 %s 的规则: 从当前第一个空白字符开始读起,直到遇到空白字符(即空格、换行符、制表符等)才停止 ---> %s 不包含空格,就不适合读取带有空格的字符串。
scanf() 传递的不是值,而是地址,所以要在变量面前加上&,但如果变量本身就是指针,就不用加&。
int arr[]={1,2,3,4};
scanf("%d",arr); //数组名是该数组首元素的地址,为指针,故而不加&
TIps: 指针变量里面存放的是地址,表示指向这个存地址的数值。
3.scanf() 的返回值 <其返回值是整数,代表成功读取的变量个数>
简单来说就是,只要没有返回 -1 ,都表示scanf() 读取没有错误。若是scanf() 返回 0 则表示未读到任何项,若是返回整数,则代表了scanf() 成功读取的个数。
4.占位符: (占位符与printf() 相似)
%d :整型
%s :字符串
%f : float 类型浮点数
%lf : double 类型附浮点数
%Lf : long double 类型浮点数
%[ ] : 在方括号中指定一组匹配的字符(比如:%[0-9] ),遇到不在集合内中的字符,匹配会停止
%c : 字符。只要是字符,都会去读取(包括空白字符)
除了 %c ,其他的占位符都会自动忽略起首的空白字符。但是如果想要让%c 强制跳过起首的空白字符,就在 %c 前面添加一个空格,以表示跳过起首的零个或多个空白字符.
char ch = '0';
scanf(" %c", &ch )://若输入为 " s"
printf("%c\n", ch ); //输出为 's'
注:为什么这里对 char 类型初始化用的是 ‘0’ ?因为字符本质上就是ASCII码值。
5.赋值忽略符 *
当要用户输入一个数据,然而这个数据的格式有多种表现形式,只想让scanf() 读取主要数据,而忽略格式,该怎么做?(eg.输入日期 年-月-日 or 年/月/日 or 年.月.日 等多种格式)
‘ * ’ ------> 赋值忽略符
%*c ;在 占位符的% 后面添加一个 赋值忽略符 * ,表示 这个占位符没有对应的变量,解读后不必返回。简单来说就是这个占位符不会有返回值,解析后就被丢弃了。
标签:字符,--,scanf,占位,空白,C语言,数据,输入 From: https://blog.csdn.net/Distinguished_z/article/details/139664329