使用具有固定宽度整数类型变量的 printf 宽度说明符
Using printf width specifier with fixed width integer type variable
w是指定输出宽度的参数,p是数字,应该以八进制打印
两个变量都应该是固定宽度的整数 (uint32_t)(这是我编程的任务 class)。
我用谷歌搜索,我可以使用宏 PRIo32 (inttypes.h) 以八进制打印 int32_t,但我找不到任何宽度说明符的宏。
所以当我尝试时:
printf("%*" PRIo32 "\n", w, p);
我在测试系统中遇到这个错误
error: field width specifier '*' expects argument of type 'int', but argument 2 has type 'int32_t' [-Werror=format=]
有没有解决这个问题的宏?或者我应该试试别的?
将 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 左右可能根本不起作用。
Environmental limits
The number of characters that can be produced by any single conversion shall be at least
4095. C17dr § 7.21.6.1 15
代码可以使用下面的代码来处理病态的大宽度——尽管它效率不高。
uint32_t w2 = w;
while (w2 > 100) {
w2--;
putchar(' ');
}
printf("%*" PRIo32 "\n", (int) w2, p);
w是指定输出宽度的参数,p是数字,应该以八进制打印 两个变量都应该是固定宽度的整数 (uint32_t)(这是我编程的任务 class)。 我用谷歌搜索,我可以使用宏 PRIo32 (inttypes.h) 以八进制打印 int32_t,但我找不到任何宽度说明符的宏。 所以当我尝试时:
printf("%*" PRIo32 "\n", w, p);
我在测试系统中遇到这个错误
error: field width specifier '*' expects argument of type 'int', but argument 2 has type 'int32_t' [-Werror=format=]
有没有解决这个问题的宏?或者我应该试试别的?
将 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 左右可能根本不起作用。
Environmental limits The number of characters that can be produced by any single conversion shall be at least 4095. C17dr § 7.21.6.1 15
代码可以使用下面的代码来处理病态的大宽度——尽管它效率不高。
uint32_t w2 = w;
while (w2 > 100) {
w2--;
putchar(' ');
}
printf("%*" PRIo32 "\n", (int) w2, p);