目录:


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 二十岁的编程男神王大爷

搬运2:早期写的探究printf的更多相关文章

  1. u-boot的nand驱动写过程分析

    从命令说起,在u-boot输入下列命令: nand write 40008000 0 20000 命令的意思是将内存0x40008000开始的部分写入nand,从nand地址0开始写,写入长度是0x2 ...

  2. printf函数的返回值

    先看下面一段程序: 文末会给大家推荐几本好书,希望能够需要的朋友一点帮助! #include <stdio.h> int main() { int i = 123; printf(&quo ...

  3. 一个人的公众号,我写了1w+

    大家好,我是Bypass,一个人一直保持着写博客的习惯,为此维护了一个技术公众号,致力于分享原创高质量干货,写的内容主要围绕:渗透测试.WAF绕过.代码审计.应急响应.企业安全. 一直以来,我把它当成 ...

  4. STM32学习笔记——printf

    printf复习 当我们写printf("%d\n", 1);的时候,printf函数并不能通过C语言语法得知第二个参数是int类型.printf是一个变参函数(variadic ...

  5. 摊牌了!我要手写一个“Spring Boot”

    目前的话,已经把 Spring MVC 相关常用的注解比如@GetMapping .@PostMapping .@PathVariable 写完了.我也已经将项目开源出来了,地址:https://gi ...

  6. 了解Java格式化输出printf,一篇就够了

    格式化详解 格式化输出 转换符 常用转换符 日期转换 搭配标志 了解C语言的都知道,C语言的输出语句printf();可以对里面的内容格式化然后输出.那么在Java中也给我们提供了相关的方法.两者十分 ...

  7. stdio.h及cstdio的区别

    2013-07-04 16:45:19 找了很多资料,没有说的很明白的,下面是老外的一篇文章,解释的比较清楚,后面给出翻译. Clarifying stdio.h versus cstdio 转自:h ...

  8. 利用fstream进行文件拷贝测试

    今天翻到一个早期写测试代码的目录,找到几个以前的测试代码,于是拿出来贴到博客中.(只是简单的测试,并不严谨.注意这里windows和linux的硬件环境不一样) 这一个是使用fstream进行文件拷贝 ...

  9. 使用 find 命令实现高级排除需求

    使用 find 命令实现高级排除需求 Linked 关于 find 命令,本博客介绍过 atime,ctime,mtime 介绍过 --exec 参数. 介绍这些的基本需求是进行文件管理.事实上,基于 ...

随机推荐

  1. HTTP快速入门

    一.tomcat端口号设置为80,访问时候可以不加:http协议1.1版本可以复用连接,请求结束后会稍微等会: 二. 表单,get方式提交: 三.user-agent告诉服务器是哪个浏览器,代码中解决 ...

  2. Django学习day12随堂笔记

    每日测验 """ 1.什么是cookie和session,你能描述一下它们的由来和工作机制吗(切勿糊弄,敷衍了事) 2.django中如何操作cookie和session ...

  3. CDI 组件拦截器的使用和学习

    拦截器的作用原理: 声明拦截器,加@Interceptor注解 方法有二: 1)为拦截器添加Qualifier: 2)不添加Qualifier.为拦截器添加具体的拦截方法,该方法加@AroundInv ...

  4. springboot整合jsp报错

    今天在学springboot整合jsp时遇到了一个问题,虽然jsp不被spring官方推荐使用,但抱着学习的心态还是想解决一下这个问题.在写好了需要pom文件之后,访问网站得到了500的错误提示,后台 ...

  5. css3 显示一行内容,多余的以省略号显示

    overflow: hidden; white-space: nowrap; text-overflow: ellipsis; 代码如上

  6. Linux服务器通用安全加固指南

    一.基本系统安全 1.保护引导过程(以Grub引导为例) 在 /etc/inittab 中添加 sp:S:respawn:/sbin/sulogin,以确保当切换到单用户模式时 运行级的配置要求输入  ...

  7. layui 各项配置

    第一.如何全部选中table中每一条记录 1.首先给table的父类设置一个唯一id *这种方式不推荐,效果比较差,推荐第2种方式 再搜索 alias-table div.layui-table-fi ...

  8. jmeter加密解密(加密篇)

    最近刚好在弄jmeter加密解密,可以分享下.(有一段时间没写了,有点不知道从何写起,这篇写的有点乱o(╥﹏╥)o) 需求是:接口中的请求体的部分参数需要先加密再请求,返回的结果中部分字段需解密. 1 ...

  9. shell脚本在CentOS7自动更包

    手动更包有些繁琐,就想着用脚本自动更包,后来试了下,最后成功啦! 以下是根据实际项目编写的: 操作环境:centos7.0 tomcat版本:7.0.78 以下为项目存放目录如下: updatefil ...

  10. [转载]PHP命名规则

    PHP命名规则 引用地址:http://www.cnblogs.com/pengxl/p/3571157.html 就一般约定而言,类.函数和变量的名字应该是能够让代码阅读者能够容易地知道这些代码的作 ...