关于C中的printf格式字符串

关于C中的printf格式字符串,c,printf,format-specifiers,C,Printf,Format Specifiers,让我们看一下下面的节目: #include <stdio.h> int main() { long t =57 ; printf("[%+03ld]", t); } 我不知怎么搞糊涂了:我告诉他用零填充宽度3(03ld)的输出,但是,如果我强制输出在数字(+)前加一个加号,那么如果数字的长度已经是2位数字(如57所示),就不会添加所需的零。对于数字,在指定填充时,左填充数字为零(0),而不是空格(请参见宽度子说明符) (+)->强制使用加号或减

让我们看一下下面的节目:

#include <stdio.h>

int main()
{
    long t =57 ;
    printf("[%+03ld]", t);
}
我不知怎么搞糊涂了:我告诉他用零填充宽度3(
03ld
)的输出,但是,如果我强制输出在数字(
+
)前加一个加号,那么如果数字的长度已经是2位数字(如57所示),就不会添加所需的零。对于数字,在指定填充时,左填充数字为零(0),而不是空格(请参见宽度子说明符)

(+)->强制使用加号或减号(+或-)来处理结果,即使对于正数也是如此。默认情况下,只有负数前面带有-号

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


所以我只需要澄清一下。。。上面引号中的
(宽度)
说明符是指由该格式说明符(
“%+03ld”
)控制的输出字符串的全长(即:将要打印的字符)或将要打印的数字的字符的全长?

是,宽度说明符是指整个格式化结果的宽度,在您的案例中为
+57
。这使得它对于在屏幕上打印柱状文本非常有用(如果您使用C编写老式的文本实用程序,这一点很重要!)。

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

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

C标准相当精确,转换值是一个整体。根据C11第7.21.6/2节(重点):

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

连同§7.21.6/4:

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


您要求3个字符的长度格式,得到3个字符
+57
。如果希望0存在,只需使用
printf(“[%+04ld]”,t)+057

“(宽度)->要打印的最小字符数。”我不知道你还需要什么;这是最清楚的了。
[+57]