一.概念带入
scanf()把输入的字符串转换成整数,浮点数,字符或字符串。而printf()正好与其相反,把整数,浮点数,字符和字符串转换成显示在屏幕上的文本。所以scanf()在使用上面会和printf有很多一样的地方,不管是占位符还是修饰符都是一样的
这里要说明下scanf()是把输入值送到变量的内存地址上,而如果要读取基本变量类型,需要在变量名加上一个&来获取变量的地址值,而字符数组比较特别,字符数组本身就可以代表地址值,带小标就需要使用&来获取变量的地址值。
二.scanf()输入原理和返回值
scanf()函数每次读取一个字符,跳过所有的空白字符,直至遇到第一个非空白字符才开始读取。
scanf()函数放回成功读取的项目
scanf()会返回成功读取的项数。如果输入一个错误类型值则会返回0
这里教大家一个小技巧,在printf("scanf返回值为: %d\n", scanf("%d %d", &a,&b));这条语句中,scanf("%d %d", &a,&b)会先执行,然后返回值会给到%d占位符。
这里b输入了一个不匹配的占位符数据,所以scanf返回值为1
三.scanf()转换说明
1.转换说明
%a | 浮点数十六进制P记数法 |
%c | 单个字符 |
%d | 有符号十进制数 |
%i | 有符号十进制整数(与%d相同) |
%e | 浮点数,e记数法 |
%f | 浮点数,十进制记数法 |
%g | 根据值的不同,自动选择%f,%e |
%o | 无符号八进制整数 |
%p | 指针 |
%s | 字符串 |
%u | 无符号十进制整数 |
%x | 无符号十六进制整数 |
2.修饰符
0 | 对于数值,用前导0代替空格填充字段宽度。如果已经出现-标记,则忽略0标记 |
h | 基本使用%hd,就是short的占位符 |
j | 表示intmax_t或uintmax_t类型的值。而这些值就定义在stdint.h中。而intmax_t就算long long数据类型别名,uintmax_t就算unsigned long long 的别名,用lld和llud都可以。 |
ll | lld表示long long int |
t | 表示ptrdiff_t类型的值。Ptrdiff_t是两个指针差值的类型 |
z | 表示size_t类型的值。就算sizeof和strlen类型的返回值。 |
数字 | 最大字段宽度,输入达到最大字段宽度处,或第一次遇到空白字符时停止 |
scanf()的使用和printf基本一样,只不过printf是输出,scanf是输入数据输入数据,唯一的不同就在数字,printf是最小字段宽度,而scanf是最大字段类型,这个我们单独演示下,其他的大家看上一章的printf就可以了
ch只有10char类型大小。所以我们用%9s控制输入到数组大小(最后一个位置要给\0);
如果你不加,则会溢出,报错
3.*:抑制赋值
*主要用于省略这个占位符
这里可以看见我输入了三个数字,567,879,123但只输入了123,这就是*的作用,它会是scanf()跳过相应的输入项。这里因为我还用了%2d,所以123,最多输入到2就会停止
四.格式字符串中的普通字符串
Scanf()允许把普通字符放在格式字符串中。,比如添加一个逗号、
scanf("%d,%d", &a, &b),因为%d和%d之间有一个, 所以我们在输入的时候也要遵循这个样式。
如果不遵循就会输入错误
五.scanf()读取错误类型值
我们先来看例子
在这个例子中,系统输入要求我们输入一个整数,但很不巧,我们输入错误了,输入成字符'q’了。这种情况下,a还是存储着一个垃圾值。但仔细看程序你会发现我后面还有一个
scanf("c",&b)给字符b的赋值,但在实际运行中,我们好像没看到,但最后b的值尽然就为q了。
这主要是因为,scanf()读取失败的的时候,会把无法读取的输入留在输入队列中,供下次读取。这也是为啥b的值自动就读取q的原因了
好了朋友们我们今天的内容到这就结束了,今天的内容到这里就结束了,如果有啥不会的朋友记得论坛里面提问哈~
如果朋友你感觉文章的内容对你有帮助,可以点赞,关注文章和专栏以及关注我哈,嘿嘿嘿我会定期更新文章的,谢谢朋友你的支持哈