代码之家  ›  专栏  ›  技术社区  ›  CodingWithoutComments

用C语言解码printf语句(printfprimer)

  •  4
  • CodingWithoutComments  · 技术社区  · 16 年前

    我正致力于将一些从1998年到21世纪的旧代码。该过程的第一个步骤之一是将printf语句转换为 QString 变量。不管我回顾printf多少次,我最终总是忘记了一件事或另一件事。所以,为了好玩,让我们一起解码它,为了ole的时间,在这个过程中创建第一个小片段 用于堆栈溢出。

    在密码里,我发现了这个小宝石,

    printf("%4u\t%016.1f\t%04X\t%02X\t%1c\t%1c\t%4s", a, b, c, d, e, f, g);
    

    6 回复  |  直到 12 年前
        1
  •  5
  •   Community CDub    8 年前

    丹尼基本上是对的。


    B浮点,小数点前至少16位(0填充),小数点后1位
    C十六进制,最少4个字符,0填充,大写字母打印

    E假设e是一个int,转换为无符号字符并打印
    F和e一样
    G这可能是一个输入错误,4没有效果。如果为“%.4s”,则最多打印字符串中的4个字符。有趣的是,在这种情况下,字符串不需要以null结尾。

    jj33 指出上面b和g中的两个错误 here .

        2
  •  5
  •   Community CDub    8 年前

    @ Jason Day

    b实际上是整个字段的最小16个字符,包括小数点和小数点后的一位数(16个字符和18个字符)

        3
  •  4
  •   pixelbeat    16 年前

    这是我的printf入门: http://www.pixelbeat.org/programming/gcc/format_specs.html

    我总是用gcc编译带-Wall的 将警告所提供数据之间的任何不匹配 printf格式和变量。

        4
  •  3
  •   Jason Day    16 年前

    @jj33,你完全正确,在这两方面。

    #include <stdio.h>
    
    int main(int argc, char *argv[]) {
        char *s = "Hello, World";
        char *s2 = "he";
    
        printf("4s: '%4s'\n", s);
        printf(".4s: '%.4s'\n", s);
        printf("4s2: '%4s'\n", s2);
        printf(".4s2: '%.4s'\n", s2);
    
        return 0;
    }
    
    $ gcc -o foo foo.c
    $ ./foo
    4s: 'Hello, World'
    .4s: 'Hell'
    4s2: '  he'
    .4s2: 'he'
    

    抢手货

        5
  •  0
  •   TheSmurf    16 年前

    A.十进制,四位有效数字

    B不确定

    F字符串,最小值为4

        6
  •  0
  •   Omer Zak    16 年前

    您真正需要的是一个工具,它将printf()语句中的格式字符串转换为等效的基于QString的函数调用。
    有人想把他的免费软件捐赠时间花在开发这样一个工具上吗?