4

我正在努力将 1998 年的一些旧代码带到 21 世纪。该过程的第一步是将 printf 语句转换为QString变量。不管我回头看多少次 printf ,我总是最终忘记一件事或另一件事。所以,为了好玩,让我们一起解码它,为了过去的缘故,并在此过程中为 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 将如何格式化?

4

6 回答 6

5

丹尼基本上是对的。

一种。无符号十进制,最少 4 个字符,空格填充
b. 浮点数,小数点前最少 16 位(填充 0),小数点后 1 位
c. 十六进制,最少 4 个字符,0 填充,字母以大写形式打印
d. 同上,但最少 2 个字符
e. e 假定为 int,转换为 unsigned char 并打印
f。与例如相同
。这可能是一个错字, 4 没有效果。如果是“%.4s”,则最多打印字符串中的 4 个字符。有趣的是,在这种情况下,字符串不需要以空值结尾。

编辑:jj33在上面b 和 g 中指出 2 个错误。

于 2008-08-11T18:11:45.697 回答
5

@ Jason Day,如果字符少于 4 个,我认为最后 %4s 中的 4 很重要。如果超过 4 个您是对的,则 %4s 和 %s 将是相同的,但 g 中少于 4 个字符的 %s 将左对齐,而 %4s 在 4 个字符字段中将右对齐。

b 实际上是整个字段的至少 16 个字符,包括我认为的小数点和小数点后的单个数字(16 个总字符与 18 个总字符)

于 2008-08-11T18:19:57.943 回答
4

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

我总是用 -Wall 和 gcc 编译,它会警告提供的 printf 格式和变量之间的任何不匹配。

于 2008-09-18T00:24:53.160 回答
3

@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'

接得好!

于 2008-08-11T18:38:58.233 回答
0

一种。十进制,四位有效数字

湾。没有把握

C。十六进制,最少 4 个字符

d。也是十六进制,最少 2 个字符

e. 1 个字符

F。字符串,最少 4 个

于 2008-08-11T17:33:50.843 回答
0

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

包含此类工具源代码的自由软件托管服务的 URL 占位符

于 2008-09-20T19:25:49.987 回答