c - 在格式化的 printf 中使用 #define 来定义精度

标签 c printf

#include <stdio.h>
#define PREC 4

int main()
{
    long l = 12;
    printf("%PRECld", l);
}

我将如何使用 PREC定义所需的精度?即预期的输出将是 0012 .正在打印%PRECld .

最佳答案

要扩展宏使其成为编译时格式字符串的一部分,您需要一个字符串化宏(是的,两层是必需的;如果您只定义了 #define STR(x) #xSTR(PREC) 将插入字符串 "PREC" ,不是您想要的 "4"):

#define _STR(x) #x
#define STR(x) _STR(x)

然后你可以像这样使用它:
printf("%0" STR(PREC) "ld", l);

这将被预处理器扩展为:
printf("%0" "4" "ld", l);

并且由于相邻的字符串文字被视为单个字符串,因此最终编译时就像您直接键入:
printf("%04ld", l);

对于运行时解决方案,您可以使用 *从参数动态设置精度,不需要字符串化宏:
printf("%0*ld", PREC, l);

理论上,这在运行时稍慢,因为它需要解析更复杂的格式字符串,传递和接收更多参数等,但在实践中 I/O 是如此昂贵以至于一点 CPU 摆弄的成本在比较。

注意添加的 0在这两个版本中,使其填充零,而不是空格。

关于c - 在格式化的 printf 中使用 #define 来定义精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58847520/

相关文章:

c - 使用 hunspell 库编译源代码时出现链接器问题

bash - 快速转义任何字符串

c++ - 指针操作导致 printf 以相反的顺序打印参数?

c - 写入文件时出现 malloc 问题

c - 为什么程序有时会出现 "skip over"printfs?

c - printf 和 gets 的区别

c - (~INT_MAX && INT_MAX) 返回 1?

c - 灵活数组成员(零长度数组)

c - 排序 2 个大数组

c - while循环中的if语句不起作用