让我们采取以下计划:
#include <stdio.h>
int main()
{
long t =57 ;
printf("[%+03ld]", t);
}
及其输出:
[+57]
我有点困惑:我告诉他用0填充输出到宽度3(03ld
),但是如果我强制输出在数字前加上一个加号({{1如果数字的长度已经是2位数,则不会添加所需的零(如57中所示)。对于数字<10,它填充为1。
来自http://www.cplusplus.com/reference/cstdio/printf/
(0) - &gt;当指定填充时,左边用零填充数字(0)而不是空格(参见width子说明符)。
(+) - &gt;即使对于正数,也要在结果前加上加号或减号(+或 - )。默认情况下,只有负数前面带有 - 符号。
(宽度) - &gt;要打印的最小字符数。如果要打印的值小于此数字,则结果将填充空格。即使结果较大,也不会截断该值。
所以我只需要澄清......上面引用的+
说明符指的是由此格式说明符控制的输出字符串的全长(即:将要打印的字符){{{ 1}})或要打印的数字的字符的全长?
答案 0 :(得分:3)
是的,宽度说明符指的是整个格式化结果的宽度+57
。这使得打印柱状文本对于在屏幕上轻松阅读非常有用(如果您使用C编写旧式文本实用程序,这很重要!)。
答案 1 :(得分:2)
C标准相当精确,转换值是一个整体。从C11§7.21.6/ 2(强调我的):
fprintf
函数将输出写入stream
指向的stream
, 在格式指向的字符串的控制下,指定如何 后续参数转换为输出。
以及§7.21.6/ 4:
可选的最小字段宽度。如果转换后的值较少 字符比字段宽度,填充空格(默认情况下) 在左侧(或右侧,如果左侧调整标志,稍后描述, 已经给出了场宽。字段宽度 采用星号*(稍后描述)或非负十进制整数的形式。
答案 2 :(得分:1)
正如您所引用的那样&#34;要打印的最小字符数。&#34;,所以&#34; +&#34;是printf的另一个角色。顺便说一句&#34; 0&#34;只是字符,与数字无关。它可以是任何角色。
答案 3 :(得分:1)
是的,字段宽度是指完整的转换值,包括小数点,符号等。
答案 4 :(得分:1)
您要求使用3个字符的长度格式并获得3个字符+57
。如果您希望0出现,只需使用printf("[%+04ld]", t);
即可获得+057
。