C 使用带有固定宽度整型变量的printf宽度说明符
w是指定输出宽度的参数,p是数字,应以八进制打印 这两个变量都应该是固定宽度的整数(uint32_t)(这是我的编程类的任务)。 我在谷歌上搜索到,我可以使用宏PRIo32(inttypes.h)以八进制打印int32_t,但我找不到任何用于宽度说明符的宏。 因此,当我尝试:C 使用带有固定宽度整型变量的printf宽度说明符,c,printf,posix,int32,C,Printf,Posix,Int32,w是指定输出宽度的参数,p是数字,应以八进制打印 这两个变量都应该是固定宽度的整数(uint32_t)(这是我的编程类的任务)。 我在谷歌上搜索到,我可以使用宏PRIo32(inttypes.h)以八进制打印int32_t,但我找不到任何用于宽度说明符的宏。 因此,当我尝试: printf("%*" PRIo32 "\n", w, p); 我在测试系统中发现了这个错误 错误:字段宽度说明符“*”需要类型为“int”的参数,但参数2的类型为“int32\u t”[-Werror=format=]
printf("%*" PRIo32 "\n", w, p);
我在测试系统中发现了这个错误
错误:字段宽度说明符“*”需要类型为“int”的参数,但参数2的类型为“int32\u t”[-Werror=format=]
有解决这个问题的宏吗?或者我应该试试别的?将
uint32\u t
宽度转换为int
如有必要,检测极端情况
assert(w <= INT_MAX);
printf("%*" PRIo32 "\n", (int) w, p);
将
uint32\u t
宽度强制转换为int
如有必要,检测极端情况
assert(w <= INT_MAX);
printf("%*" PRIo32 "\n", (int) w, p);
我想这很清楚
*
要求int
,而w
是int32\t
。您应该提供int
参数。您可以将w
转换为int
。但我必须使用int32\t
。该任务特别指出,禁止支持int为4字节,而使用int
的解决方案因其自身矛盾而被拒绝。您必须将int
传递到printf
以指定宽度说明符。*
修饰符始终需要typeint
。总是。因此,如果您有w
,您知道它是int32\u t
,并且您将其转换为(int)
,那么您就不会假设机器上的int
大小。您假设机器上的int
大小与机器上的int
大小相同,这与您使用*
修饰符时所做的printf
假设完全相同,因此您是金色的。(如果您机器上的int
小于int32_t
,如果w
大于32767,您就有问题了,但是没有人打印那么宽的字段,所以您应该没问题。)我认为这很清楚*
要求int
,而w
是int32\t
。您应该提供int
参数。您可以将w
转换为int
。但我必须使用int32\t
。该任务特别指出,禁止支持int为4字节,而使用int
的解决方案因其自身矛盾而被拒绝。您必须将int
传递到printf
以指定宽度说明符。*
修饰符始终需要typeint
。总是。因此,如果您有w
,您知道它是int32\u t
,并且您将其转换为(int)
,那么您就不会假设机器上的int
大小。您假设机器上的int
大小与机器上的int
大小相同,这与您使用*
修饰符时所做的printf
假设完全相同,因此您是金色的。(如果机器上的int
小于int32_t
,并且w
大于32767,则您有问题,但没有人打印那么宽的字段,因此您应该可以。)
uint32_t w2 = w;
while (w2 > 100) {
w2--;
putchar(' ');
}
printf("%*" PRIo32 "\n", (int) w2, p);