我正在运行一个计时器来计算我的程序的效率,我需要将它输出到超级终端。
因此,我需要在sprintf
十六进制上执行uint32_t
将其存储到字符串中。
但我一直在%08X
上收到错误。那我应该用什么呢?
我已尝试使用%ll
,%lu
,但警告仍在那里。
volatile char str_cycles=0;
volatile uint32_t total_cycles = 0x00ffffff - current_time;
sprintf(str_cycles, "%08X",total_cycles);
任何人都可以帮我吗?
答案 0 :(得分:5)
您应该收到错误,因为str_cycles
显示为volatile char str_cycles;
(单个字符)。
您应该使用<inttypes.h>
和:
char str_cycles[16];
snprintf(str_cycles, sizeof(str_cycles), "%08" PRIX32, total_cycles);
通常,snprintf()
应优先于sprintf()
,但如果您分配了足够的空间,则可以使用sprintf()
。
我也不相信volatile
限定符;你的工作是确定你拥有它的原因以及它是否正确以及是否重要。通常,您不需要易变的字符串;它使得使用它不可靠。 (这个答案首先省略volatile
上的str_cycles
,然后添加它,现在又省略了它。)
答案 1 :(得分:1)
使用固定宽度的打印说明符。
#include <inttypes.h>
char buf[9];
sprintf(buf, "%08" PRIX32,total_cycles);
答案 2 :(得分:0)
首先投放到int
或unsigned
。这是%X
所期望的类型:
sprintf(str_cycles, "%08X", (unsigned) total_cycles);