关于C中的printf格式字符串

我们采取以下计划:

#include  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子说明符)。

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

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

所以我只需要澄清……上面引用的(width)说明符指的是由此格式说明符( "%+03ld" )控制的输出字符串的全长(即:将要打印的字符)或要打印的数字的全长字符?

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

C标准相当精确,转换值是一个整体。 从C11§7.21.6/ 2(强调我的):

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

以及§7.21.6/ 4:

可选的最小字段宽度 。 如果转换后的值的字符数少于字段宽度,则在字段宽度上用左侧(或右侧,如果左侧调整标志,稍后描述)填充空格(默认情况下)。 字段宽度采用星号*(稍后描述)或非负十进制整数的forms。

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

是的,字段宽度是指完整的转换值,包括小数点,符号等。

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