目录:


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. 图像处理之Canny边缘检测(一)

    一:历史 Canny边缘检测算法是1986年有John F. Canny开发出来一种基于图像梯度计算的边缘 检测算法,同时Canny本人对计算图像边缘提取学科的发展也是做出了很多的贡献.尽 管至今已经 ...

  2. Identity角色管理一(准备工作)

    因角色管理需要有用户才能进行(需要将用户从角色中添加,删除)故角色管理代码依托用户管理 只需在Startup服务中添加角色管理即可完成 public void ConfigureServices(IS ...

  3. tk.mybatis中常用方法的使用(最实用)

    一.前言 不知道环境和maven依赖怎么配置的,先看一下这个: SpringBoot整合tk.mybatis 二.方法的介绍和使用 插入方法 int insertSelective(T var1); ...

  4. Apache配置与应用

    目录: 一.基于域名的虚拟主机 二.基于IP地址的虚拟主机 三.基于端口的虚拟主机 四.Apache连接保持 五.构建Web虚拟目录与用户授权限制 六.Apache日志分割 七.AWStats 分析系 ...

  5. 30分钟学会Docker里面开启k8s(Kubernetes)登录仪表盘(图文讲解)

    前言 我们之前搭建了第一个docker项目: windows环境30分钟从0开始快速搭建第一个docker项目(带数据库交互):https://www.cnblogs.com/xiongze520/p ...

  6. <input type="file">如何实现自定义样式

    利用样式覆盖来实现效果:先看下原本和改变后的样式 1 <!doctype html> 2 <html> 3 <head> 4 <title>file自定 ...

  7. (3)java Spring Cloud+Spring boot+mybatis企业快速开发架构之SpringCloud-Spring Cloud和Dubbo的区别及各自的优缺点

    ​ 我们先从 Nginx 说起,了解为什么需要微服务.最初的服务化解决方案是给相同服务提供一个统一的域名,然后服务调用者向这个域发送 HTTP 请求,由 Nginx 负责请求的分发和跳转. 这种架构存 ...

  8. GCN数据集Cora、Citeseer、Pubmed文件分析

    简介 本文将对Cora.Citeseer.Pubmed 数据集进行详细介绍 Cora.Citeseer.Pubmed 数据集 来源 图 节点 边 特征 标签(y) Cora "Collect ...

  9. U2-关系数据库

    2.1 关系数据结构及形式化定义 关系数据库系统是支持关系模型的数据库系统.(关系模型由关系数据结构.关系操作集合和关系完整性约束三部分组成) 2.1.1 关系 1-域 域是一组具有相同数据类型的值的 ...

  10. mybatis的mapper特殊字符转移以及动态SQL条件查询

    前言 我们知道在项目开发中之前使用数据库查询,都是基于jdbc,进行连接查询,然后是高级一点jdbcTemplate进行查询,但是我们发现还是不是很方便,有大量重复sql语句,与代码偶合,效率低下,于 ...