受限于表格宽度,本文在电脑上阅读体验更好。

printf()的精细格式控制在大部分教科书里都没有详细描述,事实上也没必要。但有时学生OJ做题时又需要,建议老师们收藏本文,作为资料存档,待学生们需要时发群里。

本文引用自作者编写的下述图书; 本文允许以个人学习、教学等目的引用、讲授或转载,但需要注明原作者"海洋饼干叔
叔";本文不允许以纸质及电子出版为目的进行抄摘或改编。
1.《Python编程基础及应用》,陈波,刘慧君,高等教育出版社。免费授课视频 Python编程基础及应用
2.《Python编程基础及应用实验教程》, 陈波,熊心志,张全和,刘慧君,赵恒军,高等教育出版社Python编程基础及应用实验教程
3. 《简明C及C++语言教程》,陈波,待出版书稿。免费授课视频

printf()函数提供丰富的占位符参数以便精细地控制输出格式。这些精细的控制在日常编程中用得不多,毕竟大部分的应用程序都是基于图形界面,而不是终端的。考虑到部分OJ系统中的在线编程题可能对输出格式作了精细要求,这里对printf()函数的格式化输出控制进行“详细”讨论。

1. 简单的printf()语法

//Project - Variable
#include <stdio.h>int main(){int n = 3;float fPrice = 3.6;float fAmount = n*fPrice;float fMoney = 20;fMoney = fMoney - fAmount;printf("%d apples, %.1f for each, %.2f in total.\n",n,fPrice,fAmount);printf("20 - %.2f = %.2f.",fAmount,fMoney);return 0;
}

上述代码的执行结果为:

3 apples, 3.6 for each, 10.80 in total.
20 - 10.80 = 9.20.


上述程序及图1展示了通过printf()进行格式化输出的最基本方法。程序中的printf( )函数共有4个参数,其中,第1个参数由双引号包裹,是一个字符串。该字符串中包含了三个占位符(place holder),在格式化输出过程中,这些占位符将依次由后续参数的值替换。图1展示了该行的各占位符、参数与输出文本之间的对应关系。

printf( )函数可以接受多个参数,其第1个参数预期为一个字符串,该字符串中的占位符个数以及要求的类型应与后续其他参数相匹配,否则会产生错误。最简单的占位符由一个%加上一个specifier说明符构成,specifier说明符详见表1。

2. 运用复杂占位符进行格式化输出

2.1 完整的占位符语法

一个完整的占位符格式如下,其中,[ ]表示其中的内容为可选项。在下述格式中,从前住后依次是%、标志(flags)、输出宽度(width)、精度(.precision)、类型长度(length)以及说明符(specifier)。其中,%以及末尾的specifier都是必需的。

%[flags][width][.precision][length]specifier

specifier说明符处于一个占位符的末尾,是占位符不可或缺的组成部分,它定义了printf()函数以何种类型来解释和输出与占位符匹配的参数。

表1 specifier说明符

说明符 输出 示例
d或i 有符号的十进制整数 827
u 无符号的十进制整数 2353
o 无符号八进制整数 621
x 无符号十六进制整数(小写) 2fb
X 无符号十六进制整数(大写) 2FB
f或F 十进制浮点小数(小写) 792.45
e 科学计数法(小写) 7.9245e+2
E 科学计数法(大写) 7.9245E+2
g 以%e或%f中的较短格式输出浮点数 792.45
G 以%E或%F中的较短格式输出浮点数 792.45
a 十六进制浮点数(小写) 0xd.1f
A 十六进制浮点数(大写) 0XD.1F
c 单个字符 z
s 字符串 hello
p 指针(地址) c280000000000000
n 输出计数:格式化输出内容为空。当前为止已格式化输出的字符总数将存储在对应的参数中,该对应参数的类型应为int*。
% 两个连续的%%将会在输出结果中产生一个%。

表2 标志(flags)选项

flags 描述
- 在给定的输出宽度中左对齐,默认右对齐
+ 对于正数,前置一个+号,对负数,前置一个-号。默认情况下,负数前置一个-号,正数前无+号。
(空格) 如果数值前无符号位,插入一个空格在数值前。
# 与%o, %x, %X配用时,在数值前分别附加0, 0x, 0X…
0 当给定输出宽度时,如果数字的字符数不够,左边补0而不是空格。

表3 输出宽度(width)选项

width/输出宽度 描述
(number) 格式化输出的最小字符宽度。如果值格式化后的宽度小于指定宽度,则以空格填充。如果值格式化后实际宽度大于指定宽度,按实际值输出。
* *号表示宽度值未在格式字符串中给出,而是作为一个附加的整数值列于被格式化输出的参数之前。

表4 精度(.precision选项)

.precision/精度 描述
.number 对于整型说明符(d, i, o, u, x, X),该精度给出了最小的输出位数大小。如果实际值小于指定位数,则在前面补0。如果实际值位数大于指定位数,按实际值输出。如果指定精度为0,意为对于值0,格式化输出结果为空。对于a,A,e,E,f和F等浮点数输出格式,该精度值给出了小数点后的位数(默认为6)。对于g和G输出格式,该精度值规定了最大输出位数。对于s输出格式,该精度值规定了最大输出字符数。默认情况下,以0结尾的C风格字符串中的全部字符都会被输出,直到遇到表示末尾的0值字符。
* *号表示精度值未在格式字符串中给出,而是作为一个附加的整数值列于被格式化输出的参数之前。

类型长度(length)项用于表示数据类型的长度。表5列出了当不同的[length]项与不同的[specifier]合用时所对应的输出参数的数据类型。

表5 length项与specifier的配用对照表

length d i u o x X f F e E g G a A c s p n
(none) int unsigned int double int char* void* int*
hh signed char unsigned char signed char*
h short int unsigned short int short int*
l long int unsigned long int wint_t wchar_t* long int*
ll long long int unsigned long long int long long int*
j intmax_t uintmax_t intmax_t*
z size_t size_t size_t*
t ptrdiff_t ptrdiff_t ptrdiff_t*
L long double

2.2 示例

2.2.1 格式化输出整数

示例中为方便观察,使用| |来标识输出宽度。

#include <stdio.h>int main(){int i = 346, j = -346;printf("i = |%+d|, j = |%d|\n",i,j);printf("i = |%015d|, j = |%+15d|\n",i,j);return 0;
}

执行结果为:

i = |+346|, j = |-346|
i = |000000000000346|, j = |           -346|

2.2.2 格式化输出浮点数

示例中为方便观察,使用| |来标识输出宽度。

#include <stdio.h>int main(){double f = 3.1415926;double d = -314.15926535798932;printf("f = |%+f|, d = |%f|\n",f,d);printf("f = |%-15.3f|, d = |%+15.2f|\n",f,d);return 0;
}

执行结果为:

f = |+3.141593|, d = |-314.159265|
f = |3.142          |, d = |        -314.16|

2.2.3 格式化输出字符串

示例中为方便观察,使用| |来标识输出宽度。

#include <stdio.h>int main(){char s[] = "tomcat";printf("|%s|\n",s);printf("|%30s|\n",s);printf("|%-30s|",s);return 0;
}

执行结果为:

|tomcat|
|                        tomcat|
|tomcat                        |

参考资料

为了帮助更多的年轻朋友们学好编程,作者在B站上开了两门免费的网课,一门零基础讲Python,一门零基础C和C++一起学,拿走不谢!

简洁的C及C++

Python编程基础及应用

如果你觉得纸质书看起来更顺手,目前Python有两本,C和C++在出版过程中。

Python编程基础及应用

Python编程基础及应用实验教程

【C】printf()使用占位符精细控制输出格式相关推荐

  1. C语言 - printf的占位符(%) 异常

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u012515223/article/details/26719135 printf的占位符(%) 异 ...

  2. c语言--余数正负判断,printf函数占位符

    1.余数正负判断 负数求模的规则是,结果的正负号由第一个运算数的正负号决定的. 11%-5->>1 -11%-5->>-1 -11%5->>-1 第一个运算数的正负 ...

  3. golang fmt格式“占位符”

    golang 的fmt 包实现了格式化I/O函数,类似于C的 printf 和 scanf. # 定义示例类型和变量 type Human struct { Name string } var peo ...

  4. python输入数字输出中文_go格式“占位符”, 输入输出,类似python的input

    golang 的fmt 包实现了格式化I/O函数,类似于C的 printf 和 scanf 定义示例类型和变量 type Human struct { Name string } var people ...

  5. Golang占位符大全

    golang 的fmt 包实现了格式化I/O函数,类似于C的 printf 和 scanf. # 定义示例类型和变量 type Human struct {Name string }var peopl ...

  6. GO语言格式化输出占位符

    golang 的fmt 包实现了格式化I/O函数,类似于C的 printf 和 scanf. 设有 # 定义示例类型和变量 type Human struct {Name string }var pe ...

  7. GoLang格式化占位符

    golang 的fmt 包实现了格式化I/O函数,类似于C的 printf 和 scanf. # 定义示例类型和变量 type Human struct {Name string } var peop ...

  8. golang fmt包中的占位符

    原文地址:https://www.cnblogs.com/qing123/articles/4353353.html golang 的fmt 包实现了格式化I/O函数,类似于C的 printf 和 s ...

  9. golang 格式化占位符相关

    事例 # 定义示例类型和变量 type Kel struct {Name string } var boy = Kel{Name:"kel"} 普通占位符 占位符 说明 举例 输出 ...

最新文章

  1. 固件模块之间的关系 C语言里面的模块
  2. jqgrid 摧毁_非个人的交流将摧毁我们
  3. Django Model 自动生成 E-R 图
  4. jdk10 换成jdk8_JDK 10的摘要Javadoc标签
  5. IT 拉呱室 | 论我遇到的最刺激的bug【长期福利站】
  6. layui tree 加载慢_图片太多,加载慢,我用了layui里的方式,放在服务器后还是太慢!怎么解决???有没有什么优化的技巧???...
  7. ThreadLocal原理机制
  8. git 管理 Linux 文件系统
  9. 录制怎么没有耳机设备_录制现场演示,第1部分:选择设备
  10. js-array自增长方式
  11. spring原理学习
  12. 201612-2 工资计算
  13. (一)Quartz2.2.1 简单例子
  14. 使用do文件进行仿真时出现“failed tofind ‘glbl’in hierarchical name ‘/glbl/GSR‘“的解决办法
  15. android自定义系统屏保Dream
  16. hazelcast java_Java分布式内存开源实现:Hazelcast
  17. 人与人之间的交往艺术
  18. Unreal Engine 4 渲染目标(Render Target)教程 之 实现雪地足迹(上)
  19. 1008 : 美元和人民币
  20. spring之AOP切面不生效!!!!!原因在这

热门文章

  1. python有道词典-Python3基础 访问在线的有道词典
  2. Android视图对象绑定方式的抉择对比分析
  3. iOS 导航控制器、导航条、导航项、控制器的关系
  4. 色字当头一把刀,看我如何用Python针对裸聊渗透测试
  5. JAVA 向带有公式的excel写入数据,获取公式计算结果
  6. dreamweave
  7. Python JWT 介绍
  8. 相机存储卡行业调研报告 - 市场现状分析与发展前景预测
  9. 拥有BitWarden软件,再也不用担心忘记密码了
  10. 熔断,降级,限流区别