将整数数组转换为char数组,每个整数每3位数

时间:2017-05-09 14:33:32

标签: c arrays char integer microcontroller

我想转换通过测量压力生成的数组。 所以我得到了一个Integer数组,就像这样,我现在将使用10个样本,但是当它完成时它可能会变成20个值:uint16_t ADCsample[10]= { 245, 332, 124, 98, 5, 156, 68, 199, 2, 105}

如您所见,值范围为0-350,没有负值。 我必须得到这样的输出:outputStr = {2,4,5,3,3,2,1,2,4,0,9,8,0,0,5,1,5,6,0,6,8,1,9,9,0,0,2,1,0,5}

因此,所有整数值都会分开并放入一个新数组中,因此ADCsample[0] = {245}变为outputStr[0-2] = {2,4,5}。但是一个或两个数字的样本必须得到值0前面,这是为了使输出具有恒定的长度。

例如:ADCsample[4] = {5}变为outputStr[12-14]={0,0,5}

我需要将这些数据发送到只有短信的服务器,短信的字符限制为160个字符。所以我必须立即发送完整的outputStr。所有的计算都是在微控制器MSP430G2553上进行的,因此它必须高效且不能用于大量内存。

任何帮助我入门的提示或代码示例,我是一个真正的新手,所以我不知道内置库的许多功能?我可以使用sprintf()或其他函数,还是会用到很多内存?

3 个答案:

答案 0 :(得分:1)

此代码正常运行,可以满足您的需求:

#include <stdio.h>
int main(void)
{
    unsigned short ADCsample[10]= { 245, 332, 124, 98, 5, 156, 68, 199, 2, 105};
    char outputStr[31];

    for (unsigned short i = 0; i < 10; i++)
    {
        outputStr[(i * 3)] = ADCsample[i] / 100 + '0';
        outputStr[(i * 3) + 1] = (ADCsample[i] / 10) % 10 + '0';
        outputStr[(i * 3) + 2] = ADCsample[i] % 10 + '0';
    }
    outputStr[30] = '\0';
    printf("output : %s\n", outputStr);
    return 0;
}

我添加了一个printf来显示结果。 outputStr的大小应该是你的int数组的大小* 3 + 1才能工作。 还应根据int int数组的大小更改for条件。

答案 1 :(得分:0)

您可以使用简单的数学运算从uint16_t获取三个字符:

uint16_t val = ...;
char hundredsDigit = (val / 100) + '0';
char tensDigit = ((val / 10) % 10) + '0';
char onesDigit = (val % 10) + '0';

当缺少数百和/或数十位数字时,这将产生零。

  

我需要实际的字符,所以我可以通过我得到的打印功能打印它们,这个函数通常可以一次打印数组中的所有字符。

如果您打算使用打印字符串的函数打印它,则需要对结果进行空值终止。最后添加一个额外的char,并将其设置为零。

答案 2 :(得分:0)

对于给定的数字,您可以按如下方式获取每个数字:

d1 = num / 100;
d2 = (num % 100) / 10;
d3 = num % 10;

第一次计算将整数除以100,有效地丢弃1和10的数字,留下100位数字。

第二个取剩余部分除以100,留下0到99之间的值,然后将结果除以10,这会使1位数字下降并留下10位数字。

第三个将剩余部分除以100,留下0到9之间的值。