搬运2:早期写的探究printf

目录:


1. 关于printf格式化输出
2. printf的一般形式
3. 转换说明
4. 格式化输出的意义
5. 转换说明修饰符
6. 修饰符中的标记
7. printf的返回值


ps:共3250字左右,printf大多数要点包括,可以收藏慢慢看。

一. 关于printf格式化输出

printf和scanf被称为输入和输出函数,或者简称为I/O函数,之所以被称为格式化是因为printf可以通过格式字符串以及参数列表来控制计算机中的数据按照一定的要求来输出。printf中的f是format (格式化)的意思。

二.printf的形式

在这里插入图片描述
关于格式字符串包含两种信息:
1.实际要打印的字符个数
2.转换说明(马上会提到)

三.转换说明
浮点数
  1. %a/ %A
    浮点数,十六进制数和p计数法(c99/c11)
  2. %e/%E
    浮点数,e计数法
  3. %f
    浮点数,十进制计数法
  4. %g/%G
    根据值的不同自动选择%f或%e,%e格式用于指数小于-4,或者大于等于精度时
float a = 0.0058, t_a = 0.000058;
printf("%g  %g",a,b);

这是输出:
在这里插入图片描述

整数(包括char)
  1. %c
    单个字符输出
  2. %d
    十进制数
  3. %i(与%d相同)
    有符号十进制整数
  4. %o
    无符号八进制整数
  5. %u
    无符号十进制整数
  6. %x/%X
    无符号十六进制整数,使用十六进制数0f/0F
其他
  1. %p
    指针
  2. %s
    字符串
  3. %%
    打印一个百分号
    (关于%%打印百分号,因为我们%后接字母代表转换说明,所以我们如果只输出%编译器就会报错,所以使用%%来打印输出百分号)
四.转换说明的意义

数据在计算机中的存储方式都是二进制格式存储,而计算机并不知道到底如何去处理,而转换说明可以通过%+字母的方式来告诉计算机如何去控制数据
例如:数字76在计算机中存储成二进制数是01001100(前面有省略的三个字节24个0),%d转换说明将其转换成字符7和6,并且在屏幕上显示76,%x会将0100110转换为十六进制计数法表示成4c,%c(76<255,所以我们可以用%c转换说明,当超过255使用%c的时候只会截取后一个字节的长度来打印输出)。

五.转换说明修饰符
修饰符 含义
标记 - + 空格 0四种含义将在后面介绍
数字 最小字段宽度,如果数字或者字符串长度超过了这个数字,系统会默认扩充
.数字 意味着精度,对于%e%E%f表示小数点右边数字的位数,%g%G表示有效字符的最大位数(包括整数位+小数位),%s表示输出字符的最大数量,对于整型变量表示最小位数(与前导0的区别后面会提到)
h 与整型转换说明一起使用,表示short int类型或者unsigned short int类型的变量
hh 与整型转换说明一起使用,表示signed char或者unsigned char
j 与整型转换说明一起使用,表示intmax_t或者uintmax_t类型的值(ps:一次没有用过)
l 与整型转换说明一起使用,表示long int或者unsigned long int类型的值
ll 与整型转换说明一起使用,表示long long int或者 unsigned long long int类型
L 表示long double类型
t 和整型转换说明一起使用,表示ptrdiff_t(ps:博主专门上网查了一下, ptrdiff_t是C/C++标准库中定义的一个与机器相关的数据类型。ptrdiff_t类型变量通常用来保存两个指针减法操作的结果。ptrdiff_t定义在stddef.h(cstddef)这个文件内。ptrdiff_t通常被定义为long int类型。(c99))类型的值
z 和整型转换说明一起使用,表示size_t的数值,例如:%zd,因为size_t不会有负数,是无符号整数,而ptrdiff_t可能有负数
六.修饰符中的标记
  • -:待打印向左对齐
int a = 10000, b = 10000;
	printf("%-8d  %-8d\n", a, b);
	printf("%8d  %8d\n", a, b);

输出:
在这里插入图片描述
也就是说向左对齐首先要求是在前面有最小字段宽度要求的情况下

  • +:根据正负前面加上+号和-号
int a=9;
printf("%+d  %+d",a,-a);

输出:
在这里插入图片描述

  • 空格:有符号值且为正,则在前面显示正号,不然显示负号并且覆盖掉空格
int a=9;
printf("% d  % d",a,-a);

输出:
在这里插入图片描述

  • :把结果转换为另外一种形式,如果是%o,则以0开始,如果是%x/%X则以0x开始打印输出,如果是浮点数,#保证了即使后面没有小数位数也会输出一个小数点,对于%g/%G格式,#则可以保证结果后面0输出出来。

int a=256;
double b=3;
printf("%#o  %o  %#x  %x  %#.0f  %.0f  %#g  %g",a,a,a,a,b,b,b,b);

输出:
在这里插入图片描述
(对应上面测试来看,慢慢理解#的含义,个人认为这是标记里面最难理解的一个)

  • 0:又称为前导0,用0代替空格来填充字段,对于整数格式,如果出现 - 标记或者指定精度,则忽略这个标记。
int a=5,b=10;
printf("%02d  %02d  %-02d  %02.3d",a,b,a,b);

输出:
在这里插入图片描述
(这里对于最后一个作以补充说明,首先%02告诉计算机应该要按照两个最小字段宽度打印,不足的补充0,而.3告诉计算机这个数最少输出三位,不足补充0,按照标记0和指定精度同时出现按照指定精度走的原则,这里我们会最少输出三位,并且不足补充0)

七.printf的返回值

首先需要说的是printf的返回值是不常见的,与scanf一样,我们在大多数情况下都是注意这两个函数的作用而不去关注这两个函数的返回值是多少。
printf的返回值是该函数成功打印输出字符的个数,如果有输出错误,则会返回-1,可以用在检查文件写入。


为了新中国更美好的明天,一起努力吧。


博客参考了c primer plus,并且附录上了代码,一来是为了平时自己查阅方便,而来也是帮助大家,某位大一新生写于2020/12/6。

by 二十岁的编程男神王大爷

posted @ 2021-10-21 20:29  写不完作业还要玩  阅读(191)  评论(0编辑  收藏  举报