在C(Printf Primer)中解码printf语句

godio 发布于 2018-03-21 c 最后更新 2018-03-21 07:33 509 浏览

我正在从1998年到21世纪带来一些旧代码。该过程的第一步是将printf语句转换为QString变量。无论我回顾printf多少次,我总是会忘记一件事或另一件事。所以,为了好玩,让我们一起解码它,为了ole'时间的缘故,并在此过程中为Stackoverflow创建第一个小的'printf primer'。 在代码中,我遇到了这个小宝石,

printf("%4u\t%016.1f\t%04X\t%02X\t%1c\t%1c\t%4s", a, b, c, d, e, f, g);
变量a,b,c,d,e,f,g如何格式化?
已邀请:

zamet

赞同来自:

一个。十进制,四位有效数字 湾不确定 C。十六进制,最少4个字符 d。也是十六进制,最少2个字符 即1个字符 F。最少4个字符的字符串

lsint

赞同来自:

丹尼大部分都是对的。 一个。无符号小数,最小4个字符,空格填充
湾浮点数,小数点前16位数(0填充),小数点后1位数 C。十六进制,最少4个字符,0填充字母以大写字母打印 d。与上面相同,但最少2个字符
即假定e是一个int,转换为无符号字符并打印为 F。与e
相同 G。这可能是一个错字,4没有效果。如果它是“%.4s”,那么将打印最多4个字符的字符串。值得注意的是,在这种情况下,字符串不需要以null结尾。 编辑:jj33指出here上方b和g两处的错误。

nfugit

赞同来自:

@ Jason Day,我认为如果少于4个字符,最后4%中的4个是重要的。如果超过4你说得对,%4s和%s将是相同的,但是g%中少于4个字符将被左对齐,%4s将在4个字符字段中右对齐。 b实际上是整个字段的最小16个字符,包括小数点后的小数点和小数点后的数字(16个字符总数和18个总字符数)

lsint

赞同来自:

你绝对是对的,在这两方面。

#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'
接得好!

ad_est

赞同来自:

这是我的printf入门书: http://www.pixelbeat.org/programming/gcc/format_specs.html 我总是用gcc编译哪个 将警告所提供的任何不匹配 printf格式和变量。

pdolor

赞同来自:

你真正需要的是一个工具,它在printf()语句中获取格式化字符串,并将它们转换为基于QString的函数调用。
有没有人想花费他的自由软件捐赠时间来开发这样的工具? 持有此类工具源代码的免费软件托管服务URL的占位符