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


#include <stdio.h>
#define PREC 4
int main()
{
long l = 12;
printf("%PRECld", l);
}

如何使用PREC来定义所需的精度?即预期输出将是CCD_ 2。当前正在打印%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,使其填充有零,而不是空格。

非常简单:

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

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

#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

相关内容

  • 没有找到相关文章