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

问题描述 投票:-3回答:3

我的问题是基于下面的片段。

    [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行会有一个警告: "从不兼容的指针类型中传递'sprintf'的参数1"

  2. 参看 字符串格式指定器我知道...

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

...但怀疑什么 %ldHz 在第132行是什么意思,为什么这一行没有被警告?

谢谢。

c printf format-specifiers
3个回答
2
投票

为什么第125行得到一个警告。"从不兼容的指针类型中传递'sprintf'的参数1。

uint8_t 不一定能直接与 char - 后者具有实现定义的签名性。uint8_t 然而,可以安全地转换为从 char所以你可以尝试用 (char*)msg 看看是否能解决这个问题。

C打印格式指定符'%ldHz'是什么意思?

格式指定符是 %ld 对于类型 long, Hz 是输出字符串的一部分(赫兹)。


3
投票

Hz 并不是格式指定符的一部分:它只是在频率值后面打印 "赫兹 "的标准缩写。所以,实际的格式指定符只是 %ld,打印一个十进制格式的长整数。


3
投票
  1. 的第一个参数 sprintf 是一个 char *. 你正在通过在一个 uint8_t * (即一个 unsigned char *). 这是一个指针类型不匹配。
  2. 实际的格式指定器是 %ld. 该 Hz 下面是被打印出来的文字。
© www.soinside.com 2019 - 2024. All rights reserved.