c++ printf控制位数_看完之后,你再也不会觉得printf函数是杂兵了!

printf函数

1. printf函数使用公式

  在前面几节中,我们已经使用过很多次printf函数了。让我们再来详细讨论一下它。首先,我们看一下,它的使用公式。

  1. printf是一个变参函数。(参数的数量和类型不确定)
  2. printf的第一个参数是字符串。
  3. printf的第一个参数是需要输出的字符以及需要被替换的占位符。
  4. printf的后续参数,是依次被替换的实际值。
  5. 占位符的类型和数量需要与后续的参数类型和数量对应。
printf

printf的第一个参数是字符串

e2848d67a99db5e1607555638fdd95dd.png

第一个参数是需要输出的字符以及需要被替换的占位符

3aaf6dbd735890c185b2ae70a760ca47.png

后续参数,是依次被替换的实际值

01906b826c9d072a9ed5a0b01f912536.png

2. 占位符

  在我们在前面的章节中,使用%d用于整型的占位,%s用于字符串的占位,%c用于字符(请参见整型5)的占位。接下来我们详细讨论一下,占位符的细节。

  占位符以%百分号开始,依次具有下面这些元素:(以下是简化版本,初学过程中,先学好常用的即可,避免掉入繁枝细节。完整的版本可以参考《C语言参考手册》第十五章)

  1. 零个或多个标志字符(-,+,0,#,或空格)。
  2. 一个可选的十进制整数常量表示的最小字段宽度
  3. 一个可选的用点号表示的精度范围,它的后面可以跟一个十进制整数。
  4. 一个可选的长度指示符,可以用下列字母组合之一来表示:ll,l,L。
  5. 由单个字符表示的转换操作,取自下面这个集合:d,e,f,o,s,u,x,X。

837e11d097bf734db270e88b519d5509.png

  下面将会使用实际演示的方法,让大家理解这5个空格里填什么会有什么效果的。

  注意:演示中,红色字体仅仅是第一行代码的解析。 后续代码与第一行类似,不再赘述。

2.1 最小字段标志

  最小字段标志表示打印出来的十进制整数的最小宽度。如果数值大小未达到最小宽度的要求,那么将会以空格填充。

示例:最小宽度5、6、7位

bde82090c47253762859acf157a718da.png

2.2 标志

标志 0 使用0而不是空格作为填充字符

示例:最小宽度5位,且使用0标志,使用0填充小于最小宽度的部分。

bba5a4750c420e548a6f65dfa142f771.png

标志 - 值在字段宽度左对齐

示例:最小宽度5位,且使用0标志,使用0填充小于最小宽度的部分且左对齐。

264dedbe78af814d61612702d83453a8.png

标志 + 总是产生符号,+(整数)或-(负数)

示例:最小宽度5位,且使用0标志,使用0填充小于最小宽度的部分。标志+,始终产生符号。

facdafb7a7c0700f475b2751ab7809df.png

标志 空格 总是产生符号-(为负数时)或空格(为正数时)

示例:最小宽度5位,且使用0标志,使用0填充小于最小宽度的部分。标志 空格 ,始终产生符号,正数为空格,负数为-。

88b796671af436c100b1dda767436b43.png

标志 # 后续介绍

2.3 精度

  精度控制小数点后的位数。

b24094941e09064b1c37495ccf822401.png

2.4 转换操作

  在前面小节中,我们用的%d来打印整型,用%s来打印字符串。在这一章中,我们认识到了,d和s,是选择了不同的转换操作。d代表将参数使用整型的方式进行转换,而s则是字符串。

  事实上,仅仅用d来进行整型的转换操作,还是不完整的。我们来认识一下更多的转换操作。

30fdcbcc83129984f76a2c9e964ba41f.png

30f94cd25c03a1ea9984caea10fb5473.png

  接下来,我们再看看o和x、X的用法。

9d3a4f17540fb035315d572edf02f2f3.png

  o将参数使用八进制打印。

  x将参数使用十六进制打印。

  X将参数使用十六进制打印(大写)。

  还记不记得,前面有一个 标志 # 还没有介绍呢?对的,这个#标志加上之后,可以使八进制前加0,十六进制前加0x。

  在上面的表格中,我们好像仅仅讲了int和unsigned int。但是,short,unsigned short,float怎么办呢?有属于它们的转换操作吗?

事实上,short、unsigned short和float在作为参数,传入printf的时候。会被自动转换成为int,float会被转换为double。所以,我们不需要额外去找它们的转换操作了。使用上面表中的转换操作即可满足要求。


​TIPS:

  上面的这种转换关系来自于默认函数实参转换​。对于变参函数的可变部分的实参​,会在​参数传入时进行转换。长度小于int的整型数据,在经过转换后,都会成为int。长度大于或等于int的整型数据,类型不变。​具体参见《C语言参考手册》6.3.5。


2.5 长度指定符

  既然比int小的类型都能转换成int,float能转换成double。这是从小到大的转换。那long,和long long,long double呢。它们总不能从大转小了吧,从大转小,就会意味着数据丢失。对的,它们不会被自动转换。那之前的转换操作对它们适用吗?我们知道d是用于转换int的,int假设有4个字节,那对于long,long long这种,大于4个字节的,肯定是不适用的。所以我们需要在转换操作前加长度指示符。

05981bf96fec79cd8ed591391f1d4c45.png

bfe1b6041a980182e7ce9d8a45be9264.png

2.6 示例

  最后,我们用几个示例,让大家继续熟悉一下,占位符的写法。

ba23cadd760380dc285aa65650c8d6bc.png

7620223fe20b7cfe42a91f66717cc8a1.png
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值