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

时间:2019-11-14 00:11:52

标签: c printf

#include <stdio.h>
#define PREC 4

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

如何使用PREC定义所需的精度?即预期的输出为0012。当前正在打印%PRECld

3 个答案:

答案 0 :(得分:5)

要扩展该宏使其成为编译时格式字符串的一部分,您将需要一个字符串化宏(是的,这两个层是必需的;如果仅定义#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,以使其填充零而不是空格。

答案 1 :(得分:2)

非常简单:

int main()
{
    long l = 12;
    printf("%*ld", PREC, l);

    return 0;
}

答案 2 :(得分:1)

只需像通常使用*一样使用字段宽度格式:

#include <stdio.h>
#define PREC 4

int main()
{
    long l = 12;
    printf("%*ld", PREC, l);   // "  12"
    printf("%0*ld", PREC, l);  // "0012"
}

请参阅printf参考并查找field width