C中整数到字符数组的转换
Conversion of integer to char array in C
我正在开发 ARM 嵌入式应用程序。我有点陷入一个愚蠢的问题 - 我有一个无符号 8 位整数数组:
uint8_t days[42] = { 0 };
它是用一些数据初始化的-初始化算法引入了很多与问题无关的变量,所以我不会在这里转贴。我在调试器变量监视中看到这个数组,我确定它填充了从 0 到 31 的整数值。
我想取这个数组的任何元素,比如第 15 个元素,并将其转换为 char*
,以便它可以显示在我的 LCD 屏幕上。我使用 sprintf
函数重写它:
char d[3] = { '0', '0', '0' };
sprintf(d, "%d", days[15]);
请注意:不,我不能使用 stdlib
itoa()
函数,因为它不符合我必须遵守的 MISRA-C 标准。
因此,我的 d
缓冲区中只得到一个二进制零值。有什么想法吗?
#include "stdafx.h"
#include <stdio.h>
int days[2] = {12,14};
char d[3] = {'0', '0', 0};
int _tmain(int argc, _TCHAR* argv[])
{
d[0] = days[1] / 10 + 0x30; // convert 10's digit to ascii
d[1] = days[1] % 10 + 0x30; // convert 1's digit to ascii
// Debugging help
printf(d);
getchar();
return 0;
}
对于 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] = '[=10=]'; // 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;
我正在开发 ARM 嵌入式应用程序。我有点陷入一个愚蠢的问题 - 我有一个无符号 8 位整数数组:
uint8_t days[42] = { 0 };
它是用一些数据初始化的-初始化算法引入了很多与问题无关的变量,所以我不会在这里转贴。我在调试器变量监视中看到这个数组,我确定它填充了从 0 到 31 的整数值。
我想取这个数组的任何元素,比如第 15 个元素,并将其转换为 char*
,以便它可以显示在我的 LCD 屏幕上。我使用 sprintf
函数重写它:
char d[3] = { '0', '0', '0' };
sprintf(d, "%d", days[15]);
请注意:不,我不能使用 stdlib
itoa()
函数,因为它不符合我必须遵守的 MISRA-C 标准。
因此,我的 d
缓冲区中只得到一个二进制零值。有什么想法吗?
#include "stdafx.h"
#include <stdio.h>
int days[2] = {12,14};
char d[3] = {'0', '0', 0};
int _tmain(int argc, _TCHAR* argv[])
{
d[0] = days[1] / 10 + 0x30; // convert 10's digit to ascii
d[1] = days[1] % 10 + 0x30; // convert 1's digit to ascii
// Debugging help
printf(d);
getchar();
return 0;
}
对于 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] = '[=10=]'; // 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;