目录:


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. abp element 显示分页

    App.vue添加组件 <template> <div id="app"> <dataTable></dataTable> < ...

  2. 【数据库上】第五讲 E-R模型扩展知识

    第五讲 E-R模型扩展知识 一.E-R模型设计主意问题 1.1 用实体还是实体集 案例:学院对象的表示 应将各个学院看做实体集,还是实体? 方法一:将各个学院看作一个实体集 如果各学院具有不同属性特征 ...

  3. Vue3 父组件调用子组件的方法

    Vue3 父组件调用子组件的方法 // 父组件 <template> <div> 父页面 <son-com ref="sonRef"/> < ...

  4. Stream 流

    Stream流(接口不是函数接口) 描述 在java.1.8中,由于 lambda表达式这种函数编程jdk引入了一个全新的改变Stream流它是用来解决已有集合类库的一些弊端的. Stream是jav ...

  5. Wpf读写Xaml文件

    前言 本文主要介绍Wpf读写Xaml文件. 读写实现 首先我们使用XamlWriter将Wpf的对象转换为Xaml字符串,代码如下: var btn = sender as Button; strin ...

  6. Mac上Markdown的使用

    Markdown是什么,且听我快快道来. 20年前,我第一次接触互联网,当时还是用 28.8k的猫拨号. 我从一本<电脑报>附赠的光盘里,找到了 台湾版的"烘培机"(烘 ...

  7. Spring Cloud Hystrix 学习(二)熔断与降级

    今天来看下Hystrix的熔断与降级. 首先什么是降级?当请求超时.资源不足等情况发生时进行服务降级处理,不调用真实服务逻辑,而是使用快速失败(fallback)方式直接返回一个托底数据,保证服务链条 ...

  8. CentOS8安装ntp实现时间同步

    在CentOS8.0中默认不再支持ntp软件包,时间同步将由chrony来实现,像我这种习惯了ntp同步时间的,一时难以去适应chrony. 本文将通过wlnmp提供的源,来安装ntp服务 添加wln ...

  9. win7下python2.7安装 pip,setuptools的正确方法

    windows7  下 0.先安装python2.7.13 32位:https://www.python.org/ftp/python/2.7.13/python-2.7.13.msi 64位:htt ...

  10. js原型和原型链理解 constructor 构造函数

    一.对象:普通对象   函数对象 二.构造函数特点:1.需要new实例化,内部使用this对象指向即将要生成的实例对象  2.首字母大写,用于区分普通函数 function Person(name){ ...