【问题标题】:C format specifier questionC格式说明符问题
【发布时间】:2009-10-20 13:22:24
【问题描述】:

在我工作的时候,我遇到了一个别人写的代码。 我看到一个声明,

sprintf(o_params->o_file_name,
        "%s_%s_%04.4d_%s_%s.ASC",
        "OUTD", "RM", sequence_no, DateStamp_buf1, TimeStamp_buf1
);

在上面的语句中,我看到了%04.4d。这是一个正确的格式说明符吗?

变量sequence_nostatic int,它没有小数点。

【问题讨论】:

    标签: c++ c unix printf


    【解决方案1】:

    来自FreeBSD manpageman 3 printf

    可选精度,形式为 一段时间 。后跟一个可选的 数字串。如果数字字符串是 省略,精度取为 零。 这给出了最小数量 d, i, o, u 出现的位数, x 和 X 转化次数, 后面出现的数字 a、A、e、E、f 和 F 的小数点 转换,最大数量 g 和 G 的有效数字 转换,或最大数量 要从字符串打印的字符 用于 s 次转化。

    所以在这种情况下,%04.4d.4 指定应该打印所有四位数字。当然,04 部分只是在小于 1000 时用前导零填充数字。但是,在这种情况下,如上述手册页所述,

    `0'(零)零填充。对于除 n 之外的所有转换,转换后的 值在左边用零填充,而不是 比空白。 如果使用数字给出精度 转换(d、i、o、u、i、x 和 X),0 标志是 忽略

    既然肯定会打印所有四位数字,我的猜测是它只是一个剩余的或错字或其他东西。此语法会产生带有 gcc -Wall 的编译器警告(参见 Sinan Unur 的示例),但它似乎不是实际错误。

    【讨论】:

    • 是的,这就是我的疑问...如果 %04d 的目的相同,为什么要添加 .4 呢?
    • +1 表示“%04.4d”是多余的。事实上,“0”被忽略:来自 sprintf 手册页:“如果使用数字转换(d、i、o、u、x 和 X)给出精度,则忽略 0 标志。”跨度>
    【解决方案2】:

    "dot whatever" 指定精度。根据 sprintf 的手册页,这对于 ints (d) 意味着以下内容:

    精度(如果有)给出了必须的最小位数 出现;如果转换后的值需要更少的数字,它是 左边用零填充。

    【讨论】:

      【解决方案3】:

      看这里:sprintf

      .number:对于整数说明符(d、i、o、u、x、X):精度指定要写入的最小位数...

      有效。

      【讨论】:

        【解决方案4】:

        %04.4d 表示对应的参数是一个int,它应该打印前导零,字段宽度为4,精度为4。

        对我来说似乎是正确的(假设输出看起来像你想要的那样)。

        【讨论】:

        • 是的,我同意,但为什么要添加 .4,因为 04d 具有相同的目的,提供相同的输出。
        【解决方案5】:

        %04.4d 在我看来是有效的。它不只是一个具有 4 个字符宽度和 4 个精度的小数吗?

        %[flags][width][.precision][length]specifier
        

        看这里

        link text

        【讨论】:

        • 如果 %04d 的用途相同,为什么要添加 .4?
        • 感谢 Kinopiko,修正了错字
        【解决方案6】:

        %dprintf 中整数的格式说明符:

        转换说明符及其含义为:

        diouxX int(或适当的变体)参数被转换为有符号的
                十进制(d 和 i)、无符号八进制 (o)、无符号十进制 (u) 或
                无符号十六进制(x 和 X)表示法。字母“abcdef”
                用于 x 转换;字母“ABCDEF”用于 X
                转换。精度,如果有的话,给出最小数量
                必须出现的数字;如果转换后的值需要更少
                数字,它在左边用零填充。
        

        假设@Kinopiko 的解释是正确的,这里是%4d%4.4d 之间的区别(也说明了为什么不需要%04.4d 以及gcc 发出适当的警告):

        #include <stdio.h>
        
        int main(void) {
            int t = 123;
            printf("%%04.4d:\t" "%04.4d\n", t);
            printf("%%4.4d:\t"   "%4.4d\n", t);
            printf("%%04d:\t"     "%04d\n", t);
            printf("%%4d:\t"       "%4d\n", t);
            return 0;
        }
        
        C:\Temp> gcc z.c -o z.exe -Wall z.c:在函数'main'中: z.c:5:警告:“0”标志被忽略,精度和“%d”printf 格式 z.c:5:警告:“0”标志被忽略,精度和“%d”printf 格式 C:\温度> z %04.4d:0123 %4.4d:0123 %04d: 0123 %4d: 123

        【讨论】:

        • 不,他在问为什么.4%04 之后。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-11-27
        • 1970-01-01
        • 2013-02-13
        • 1970-01-01
        • 1970-01-01
        • 2018-07-01
        • 1970-01-01
        相关资源
        最近更新 更多