如何避免 uint8_t 数据类型的 sprintf 警告

How to avoid sprintf warning for uint8_t data type

我的问题基于以下片段:

    [line1] #include <stdio.h>
    .
    .
    .
    [line123] uint8_t msg[100];
    [line124] memset(msg,0,sizeof(msg));
    [line125] sprintf(msg,"SYSCLK : %ld\r\n",HAL_RCC_GetSysClockFreq());
    [line126] HAL_UART_Transmit(&huart2,msg,strlen(msg),HAL_MAX_DELAY);
    .
    .
    .
    [line130] char msg1[100];
    [line131] memset(msg1,0,sizeof(msg1));
    [line132] sprintf(msg1,"SYSCLK : %ldHz\r\n",HAL_RCC_GetSysClockFreq());
    [line133] HAL_UART_Transmit(&huart2,(uint8_t*)msg1,strlen(msg1),HAL_MAX_DELAY);
  1. 为什么第 125 行会收到警告:“ passing argument 1 of 'sprintf' 来自不兼容的指针类型“

  2. 参考String Format Specifiers,我知道...

    • h是一个长度修饰符,适用于无符号短参数,
    • hh 到无符号字符,并且
    • z 到 size_t

...但是怀疑第 132 行的 %ldHz 是什么意思,为什么这条线没有收到警告?

谢谢。

Hz 不是格式说明符的一部分:它只是在频率值之后打印 "Hertz" 的标准缩写。因此,实际的格式说明符只是 %ld,以十进制格式打印一个长整数。

  1. sprintf 的第一个参数是 char *。您正在传递 uint8_t *(即 unsigned char *)。那是指针类型不匹配。
  2. 实际的格式说明符是%ld。后面的 Hz 只是打印的文字。

Why does line 125 get a warning: " passing argument 1 of 'sprintf' from incompatible pointer type

uint8_t 不一定直接兼容 char - 后者具有实现定义的签名。然而,uint8_t 可以安全地转换为 to/from char,因此您可以尝试使用 (char*)msg 进行转换,看看是否能解决问题。

What does C print format specifier ' %ldHz ' mean?

类型 long 的格式说明符是 %ldHz 是输出字符串(赫兹)的一部分。