将整数转换为char数组函数

时间:2014-06-21 17:07:58

标签: c++ c arrays char

我想将一个数字转换为一个非零终止的char数组,而没有任何预定义的C / C ++函数(例如itoa)。 我没有足够的空间(在一个总共5KB pgm空间的嵌入式应用程序上工作,我已经使用了4.862KB)并且我的输出函数不接受零终止的char数组;只有一个数组和长度。

编辑1:我不在公司工作:P

编辑2:不接受意味着如果阵列中有0字节,它将无缘无故发送。

编辑3:我使用来自莫斯科的Vlad的方法的修改版本解决了这个问题。下面。还要感谢所有帮助过我的人:)

编辑4:如果有人关心:该项目正在使用蓝牙设置基于AVR的闹钟。

2 个答案:

答案 0 :(得分:2)

由于我的小时费率等于零(我失业),我会展示一种可能的方法。:)

在我看来,最简单的方法是编写一个递归函数。例如

#include <iostream>

size_t my_itoa( char *s, unsigned int n )
{
    const unsigned base = 10; 
    unsigned digit = n % base;
    size_t i = 0;

    if ( n /= base ) i += my_itoa( s, n );

    s[i++] = digit + '0';

    return i;
} 

int main() 
{
    unsigned x = 12345;
    char s[10];

    std::cout.write( s, my_itoa( s, x ) );

    return 0;
}

输出

12345

虽然我使用unsigned int,但你可以修改它接受int类型对象的函数。

如果你需要在函数中分配字符数组,那么它将更简单,并且可以是非递归的。

答案 1 :(得分:0)

一般算法:

我个人不推荐递归算法,除非我知道嵌入式系统所施加的堆栈限制(例如PIC具有非常有限的堆栈深度)以及当前的堆栈使用情况。

orignumber = 145976

newnumber = orignumber 

newnumber = new number / 10
remainder = new number % 10    answer: 6
digit = remainder + 30 hex -> store into array  answer:0x36  ascii 6
increment array location

newnumber = new number / 10
remainder = new number % 10    answer: 7
digit = remainder + 30 hex -> store into array  answer:0x37  ascii 7
increment array location

newnumber = new number / 10
remainder = new number % 10    answer: 9
digit = remainder + 30 hex -> store into array  answer:0x39  ascii 9
increment array location

repeat these 4 steps while new number > 0  

Array will contain: 0x36 0x37 0x39 0x35 0x34 0x31
null terminal array, 

null终止允许轻松计算字符串长度和字符串反转。 另一个选择是通过递减指针来填充数组,以避免反转字符串。

Array will contain: 0x36 0x37 0x39 0x35 0x34 0x31 0x00
finally reverse array

Array will contain: 0x31 0x34 0x35 0x39 0x37 0x36 0x00