2014-10-09 66 views
3
格式化字符串

让我们以下面的程序:关于用C

#include <stdio.h> 

int main() 
{ 
    long t =57 ; 
    printf("[%+03ld]", t); 
} 

,它的输出:

[+57] 

我莫名其妙地感到困惑:我告诉他垫的输出宽度3(03ld ),但为零,但如果强制输出在数字前加一个加号(+),如果该数字的长度已经是2位数(如57),它不会添加所需的零。对于数字< 10它填充1个零。

http://www.cplusplus.com/reference/cstdio/printf/

(0) - >左垫用零的数目(0)而不是空格配置的填充时(参见宽度子说明符)。

(+) - >即使对于正数,强制在结果前加上加号或减号(+或 - )。默认情况下,只有负数前面带有 - 符号。

(宽) - >要打印的最少字符数。如果要打印的值小于此数字,则结果将填充空白。即使结果较大,该值也不会被截断。

所以我只需要澄清...上方从报价的(width)说明符指的是输出的字符串(即:将要打印的字符)的整个长度由该格式说明("%+03ld")控制或要打印的号码字符的全长?

+1

“(宽度) - >最小字符数_要打印_”。我不知道你还需要什么;这要尽可能清楚。 – 2014-10-09 08:28:51

回答

3

是的,宽度说明符是指整个格式化结果的宽度,+57在您的情况。这对于打印柱状文本以方便在屏幕上阅读很有用(对于使用C编写旧式文本实用程序很重要!)。

1

正如您所引用的“最少要打印的字符数”,所以“+”只是printf的另一个字符。顺便说一句零“0”只是字符,也与数字无关。它可以是任何角色。

1

是,场宽度指的是完整的,换算值包括小数点,招牌等

2

C标准是相当精确的是转换后的值取一个整体。从C11§7.21.6/ 2(重点煤矿):

fprintf功能将输出写入到stream指向stream, 下字符串的控制由格式指定指向 后续的参数是如何转换为输出

与§7.21.6/ 4沿着:

可选最小字段宽度。如果转换后的值的字符数比字段宽度少,则会在左侧(或右侧,如果已经给出左侧调整标志,后面将介绍 )填充空格(默认情况下为 )为字段宽度。字段宽度 采用星号*(稍后介绍)或非负十进制整数的形式。

1

您要求输入3个字符的长度格式并获得3个字符+57。如果你想让0出现,只需使用printf("[%+04ld]", t);,你会得到+057