首页 > 解决方案 > 使用具有固定宽度整数类型变量的 printf 宽度说明符

问题描述

w是指定输出宽度的参数,p是数字,应该以八进制系统打印 两个变量都应该是固定宽度整数(uint32_t)(这是我的编程课的任务)。我用谷歌搜索,我可以使用宏 PRIo32 (inttypes.h) 以八进制打印 int32_t,但我找不到任何宽度说明符的宏。所以当我尝试:

printf("%*" PRIo32 "\n", w, p);

我在测试系统中收到此错误

错误:字段宽度说明符“*”需要“int”类型的参数,但参数 2 的类型为“int32_t”[-Werror=format=]

有没有解决这个问题的宏?还是我应该尝试别的?

标签: cprintfposixint32

解决方案


uint32_t宽度转换为int. @卡米尔库克

// printf("%*" PRIo32 "\n", w, p);
printf("%*" PRIo32 "\n", (int) w, p);

如有必要,检测极端情况

assert(w <= INT_MAX);
printf("%*" PRIo32 "\n", (int) w, p);

不需要关于int范围的假设。


更深的

请注意,由于环境限制,单张宽度的打印件会遇到麻烦。超过 4095 左右的宽度可能根本不起作用。

环境限制 任何一次转换可以产生的字符数至少应为 4095。 C17dr § 7.21.6.1 15

代码可以使用下面的代码来处理病态的大宽度——尽管它效率不高。

uint32_t w2 = w;
while (w2 > 100) {
  w2--;
  putchar(' ');
}
printf("%*" PRIo32 "\n", (int) w2, p);

推荐阅读