关于C中的printf格式字符串

时间:2014-10-09 08:21:50

标签: c printf format-specifiers

让我们采取以下计划:

#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}})或要打印的数字的字符的全长?

5 个答案:

答案 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