目录:


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,或者大于等于精度时
  1. float a = 0.0058, t_a = 0.000058;
  2. 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可能有负数
六.修饰符中的标记
  • -:待打印向左对齐
  1. int a = 10000, b = 10000;
  2. printf("%-8d %-8d\n", a, b);
  3. printf("%8d %8d\n", a, b);

输出:



也就是说向左对齐首先要求是在前面有最小字段宽度要求的情况下

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

输出:

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

输出:

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

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

输出:



(对应上面测试来看,慢慢理解#的含义,个人认为这是标记里面最难理解的一个)

  • 0:又称为前导0,用0代替空格来填充字段,对于整数格式,如果出现 - 标记或者指定精度,则忽略这个标记。
  1. int a=5,b=10;
  2. 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. 史上最详细的信号使用说明(已被收藏和N次)

    Unix环境高级编程(第三版) 第10章 信号 文章目录 1. 引言 2. 信号的概念 2.1 信号操作之忽略信号 2.2 信号操作之捕捉信号 2.3 信号操作之执行系统默认操作 2.4 常见的信号 ...

  2. iframe 内容适用高度

    HTML: <div class="content"> <iframe id="frameObj" src="链接" fr ...

  3. FastAPI(5)- get 请求 - 查询参数 Query Parameters

    什么是查询参数? http://127.0.0.1:8000/get?name=xxx&age=18 http://127.0.0.1:8000/get?age=18&name=xxx ...

  4. trait能力在PHP中的使用

    相信大家对trait已经不陌生了,早在5.4时,trait就已经出现在了PHP的新特性中.当然,本身trait也是特性的意思,但这个特性的主要能力就是为了代码的复用. 我们都知道,PHP是现代化的面向 ...

  5. php move_uploaded_file保存文件失败

    move_uploaded_file保存失败后找错,先使用了try catch,但是没输出信息,才知道该函数在php中是警告属于error,不属于exeption,因此不能通过简单的if(!...)处 ...

  6. 解决dede编辑器不能保存word文档样式问题

    ckeditor在dede里不能保存样式,试过多种解决办法都还是没有解决.最终将编辑器换成FCK得到解决. 第一步:下载FCK编辑器 下载地址: 链接: http://pan.baidu.com/s/ ...

  7. lumen-phpunit 单元测试

    lumen-框架5.8为例 1,把vendor下的bin目录放到环境变量里面: 2,设置路由 $router->get('syn', ['uses' => 'syn\syn@diction ...

  8. centos查找大文件

    首先到相当的目录下面,按下面方式查找 find . -type f -size +800M  -print0 | xargs -0 ls -lah或者从根目录(/)开始查找find / -type f ...

  9. python多线程与_thread模块

    进程与线程 1.进程:计算机程序只是存储在磁盘中的可执行二进制(或其他类型)的文件.只有把他们加载到内存中并被操作系统调用,才具有其生命周期.进程则是一个执行中的程序.每个进程都拥有自己的地址空间,内 ...

  10. CF235D-Graph Game【LCA,数学期望】

    正题 题目链接:https://www.luogu.com.cn/problem/CF235D 题目大意 给出一棵基环树,每次随机选择一个点让权值加上这个点的连通块大小然后删掉这个点. 求删光所有点时 ...