【问题标题】:About printf format string in C关于 C 中的 printf 格式字符串
【发布时间】:2024-01-21 01:59:01
【问题描述】:

我们来看看下面的程序:

#include <stdio.h>

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

它的输出:

[+57]

我有点困惑:我告诉他将输出填充到宽度 3 (03ld),用零填充,但是似乎如果我强制输出在数字前加上一个加号 (+) 它如果数字的长度已经是 2 位数(如 57),则不会添加所需的零。对于

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

(0) -> 在指定填充时,用零 (0) 代替空格填充数字(参见宽度子说明符)。

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

(width) -> 要打印的最小字符数。如果要打印的值比这个数字短,结果用空格填充。即使结果更大,该值也不会被截断。

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

【问题讨论】:

  • "(width) -> 要打印的最小字符数。"我不知道你还需要什么;这是尽可能清楚的。

标签: c printf format-specifiers


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    C 标准相当精确,将转换后的值作为一个整体。来自 C11 §7.21.6/2(强调我的):

    fprintf函数将输出写入stream指向的stream, 受格式所指向的字符串的控制,该格式指定如何 随后的参数被转换为输出

    连同 §7.21.6/4:

    可选的最小字段宽度。如果转换后的值较少 字符比字段宽度,它用空格填充(默认情况下) 在左侧(或右侧,如果是左侧调整标志,稍后说明, 已给出)到字段宽度。场宽 采用星号 *(稍后描述)或非负十进制整数的形式。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            最近更新 更多