在C中将整数转换为char数组

时间:2015-03-16 12:44:09

标签: c embedded type-conversion misra

我正在开发一个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缓冲区中获得二进制零值。有什么想法吗?

2 个答案:

答案 0 :(得分:3)

对于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;

答案 1 :(得分:0)

#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;
}