printf()的细节操作很多,对于现阶段的朋友来说,主要还是以理解为主。因为很多的确很难用到。
目录
一.转换说明(占位符)
二.printf()转换说明修饰符
1.数字
2.%数字1.数字2
3.整型转换字符补充
4.标记
-符号
+符号
空格符号
#符号
0符号
5.*修饰符
三.转换不匹配(很重要,尽量理解)
四.printf()返回值
五.printf打印较长的字符串
1.分成多个printf()进行打印
2.在字符串中使用反斜杠(\)和Enter键盘组合来断行
3.把字符串分为多个字符串,printf在打印时候会自动把字符串进行连接打印
一.转换说明(占位符)
printf("My favorite number is %d because it is first.\n",num); //打印字符串,将num变量存储的1替换到 %d 的位置上。这里的%d就是占位符(转换说明),下面我将列出我们能使用到的基本多有转换说明
%a | 浮点数十六进制P记数法 |
%c | 单个字符 |
%d | 有符号十进制数 |
%i | 有符号十进制整数(与%d相同) |
%e | 浮点数,e记数法 |
%f | 浮点数,十进制记数法 |
%g | 根据值的不同,自动选择%f,%e |
%o | 无符号八进制整数 |
%p | 指针 |
%s | 字符串 |
%u | 无符号十进制整数 |
%x | 无符号十六进制整数 |
%% | 打印% |
%zd | sizeof()和strlen的返回类型 |
这快大家根据打印数据类型选择就好了。我们下面将重点介绍转换说明修饰符
二.printf()转换说明修饰符
printf()的转换说明修饰符是插入在% 字母之间的
1.数字
表示最小字段宽度。如果字段无法容纳待打印的数字或字符串,系统会使用更宽的字段。
首先是%3d,这里a只有1,但3规定了字段为3,所以在最后的打印中1前面补了2个空格。%10s同样的道理,因为hello只有五个字段宽度,所以打印时前面补了5个空格。
然后是%3s,因为hello是5个字段宽度。所以满足3这个最小字段宽度,正常打印就好了。
2.%数字1.数字2
数字1用于表示最小字符宽度(就算上面那个效果)
数字2:
对于%e,%f转换,表示小数点右边数字的位数
对于%g,表示有效数字最大位数
对于%s,表示待打印字符的最大数量
对于整数,表示待打印数字的最小位数
首先是%1.3e和%1.3f,这里我们看到不管是数字计数法还是指数计数法,小数点后都只有三位数。
%1.3g,首先解释下最大位数就算不包括小数点所展示出来的数。所以只显示了1.11只有三个数字。
%1.3s,规定了最多显示三个字符,所以只打印了hel
%1.3d,整数的数字2和数字1功能一样,只不过前者用0填充空缺,后者用空格填充空缺
3.整型转换字符补充
其实这个我们在前面基本也都遇到了,我们先来总体看看
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类型的返回值。 |
除了t的其他的我们都讲过了,所以这里重点介绍指针差值。其实看到图你基本就能看出来其实用%d也可以,只不过会警报。所以如果你实在搞不懂该用哪种返回类型,直接用%d就行,如果结果不对就%ld。
4.标记
标记一共有五种。分别为-,+,空格,#,0;
- | 待打印项左对齐(从字段的左侧开始打印该项) |
+ | 符号值若为正,则在值前面显示加号。若为负,则在值前面显示减号 |
空格 | 符号值若为正,则在值前面显示空格。若为负,则在值前面显示减号并覆盖空格 |
# | 把结果转换为另一种心事。%0,则以0开始。如以%下,则以0x先开始。对于浮点数类型,#保证了即使后面没有任何数字,也打印一个小数点字符。对于%g,#防止结果后面的0被删除。 |
0 | 对于数值,用前导0代替空格填充字段宽度。如果已经出现-标记,则忽略0标记 |
首先
-符号
+符号
和直接使用%d的区别在于,整数前面会加个+号
空格符号
红下划线那里有一个前导零
#符号
这里重点讲解下%.0f和%.0f。为了表现对于浮点数类型,#保证了即使后面没有任何数字,也打印一个小数点字符。如果不加.0这个修饰符就看不出效果,它会自动算出小数点后6位(如下图所示)
0符号
首先来看红下划线,%10d里面一共有2个修饰符,一个0,另一个10(最小字段宽度),所以前导都用0填充,这个效果用%.10d是一样的
黄色下划线部分,有三个修饰符,-(左对齐),0(因为-的存在自动省略),10(最小字段宽度)
5.*修饰符
用变量值代替*号部分
可以看到
printf("%*d",number,rv)我们用number变量代替*位置,rv代替d位置
我们这里输入了5,在因为是整数类,所以会打印5位数,4个空格加数字1
三.转换不匹配(很重要,尽量理解)
第一行:num变量对应转换说明 %hd 和 %hu的输出都是336,因为%hd对应short和unsigned short它们内部存储的位是一样的,且都是正好,所以不会出现转化不匹配的情况(这就是一个正常情况)
第二行:mnum变量对应的转换说明%hd 有符号的short,所以-336正常,而%hu为无符号的short,又遇到赋值,这里就会出现打印65200数值情况,并非期望的336。这事由于short int类型的值在外面的参考系统中的表示方式所致。
首先,short int的大小是2字节,其次,系统使用二进制补码来表示有符号整数(这个外面在后面会进行讲解的)。这种情况下,0~32767表示正数部分,32768~65535则用于表示负数,其中,65535表示-1,65534为-2,所以-336就为65200.
这里需要知道,当要解释为有符号int,65200代表-336.被解释为无符号int时,65200则就表示65200
第三行:short int时二字节,char是1字节。当printf()使用%c打印336是,它只会查看存储336的2字节中的后1字节。相当于”以256为模“,即该数字除以256后取其玉树,336%256为80,对应P
最后一行和第三行原理一样,%d用4个字节,%hd用2个字节,%c用一个字节
这里我们在来看一个例子,
在使用%le,打印时,会取8个字节的空间,而long只占4个字节空间,这就导致它会取后面四个字符的其他空间值,最终形成的一个乱值。
四.printf()返回值
它将返回打印字符的个数。如果有输出错误,printf()则返回一个负值
五.printf打印较长的字符串
在日常当然遇到打印较长字符串的时候,一半有三种解决。这边我们以打印字符串"Today is the New Year. I wish you good health, career and study in the new year"为例。
1.分成多个printf()进行打印
2.在字符串中使用反斜杠(\)和Enter键盘组合来断行
3.把字符串分为多个字符串,printf在打印时候会自动把字符串进行连接打印
好了朋友们我们今天的内容到这就结束了,今天的内容到这里就结束了,如果有啥不会的朋友记得论坛里面提问哈~
如果朋友你感觉文章的内容对你有帮助,可以点赞,关注文章和专栏以及关注我哈,嘿嘿嘿我会定期更新文章的,谢谢朋友你的支持哈