在C语言中解读printf语句(Printf入门)

4
我正在将一些1998年的旧代码更新到21世纪。这个过程中的第一步是将printf语句转换为QString变量。然而,无论我回顾printf多少次,我总是会忘记其中的某些细节。因此,让我们一起解码它,为了旧时光和创建Stackoverflow的第一个小型'printf入门指南',来一场有趣的冒险。
在代码中,我发现了这个小宝石:
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将如何格式化?
6个回答

5

Danny大部分是正确的。

a. 无符号十进制,最少4个字符,用空格填充
b. 浮点数,小数点前最少16位数字(0填充),小数点后1位数字
c. 十六进制,最少4个字符,0填充,字母大写打印
d. 与上述相同,但最少2个字符
e. 假设e是int类型,转换为unsigned char并打印
f. 与e相同
g. 这很可能是一个笔误,数字4没有作用。如果是"%.4s",则会打印字符串中最多4个字符。有趣的是,在这种情况下,字符串不需要以null结尾。

编辑:jj33指出了b和g中的2个错误在这里


对于 g,数字 4 会产生影响:如果字符串长度小于 4,则在左侧填充空格。 - R.. GitHub STOP HELPING ICE

5
Jason Day先生,如果字符数少于4个,则最后一个%4s中的4是重要的。如果字符数多于4个,则您是正确的,%4s和%s将是相同的,但对于g中少于4个字符的情况,%s将左对齐,而%4s将右对齐在一个长度为4的字段中。
实际上,b是整个字段的最小值为16个字符,包括小数点和小数点后的单个数字(总共16个字符与18个字符相比)。

4

我几个月前偶然发现了这篇入门指南,立刻将其加入了书签。自那以后,我已经经常使用它。感谢您抽出时间来编写它! - SiegeX

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'

做得好!


0
你真正需要的是一种工具,它可以将printf()语句中的格式字符串转换为相应的基于QString的函数调用。
有人愿意花费他们的自由软件捐赠时间来开发这样的工具吗?

占位符URL,指向一个持有此类工具源代码的自由软件托管服务


1
或者您可以使用 QString::sprintf,它是 QString 类的一部分,并且“支持标准 C++ 库中 printf() 提供的大多数转换说明符。” - David Dibben

0

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

b. 不确定

c. 十六进制,最小4个字符

d. 同样是十六进制,最小2个字符

e. 1个字符

f. 字符串,最小4个字符


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接