对于 MISRA-C 合规性,您当然也不能使用sprintf()
stdio.h 中的任何其他内容。无论如何,您通常都希望避免 sprintf 像任何嵌入式系统上的瘟疫一样。
编写一个简单的十进制整数到字符串转换例程是非常基本的东西......这是我对 MISRA-C(2004 和 2012)兼容版本的尝试:
#include <stdint.h>
void dec_to_str (char* str, uint32_t val, size_t digits);
int main (void)
{
char str[3u + 1u]; // assuming you want null terminated strings?
dec_to_str(str, 31u, 3u);
return 0;
}
void dec_to_str (char* str, uint32_t val, size_t digits)
{
size_t i=1u;
for(; i<=digits; i++)
{
str[digits-i] = (char)((val % 10u) + '0');
val/=10u;
}
str[i-1u] = '\0'; // assuming you want null terminated strings?
}
注意:uint32_t 变量可能会被换成 uint8_t,但是您需要在所有地方添加类型转换,以防止隐式类型提升,如 MISRA 所要求的。然后代码将变得非常难看,如下所示:
str[digits-i] = (char)(uint8_t)((uint8_t)(val % 10u) + '0');
那么唯一明智的做法是将混乱分成几行:
uint8_t ch = (uint8_t)(val % 10u);
ch = (uint8_t)(ch + '0');
str[digits-i] = (char)ch;