我想将一个数字转换为一个非零终止的char数组,而没有任何预定义的C / C ++函数(例如itoa)。 我没有足够的空间(在一个总共5KB pgm空间的嵌入式应用程序上工作,我已经使用了4.862KB)并且我的输出函数不接受零终止的char数组;只有一个数组和长度。
编辑1:我不在公司工作:P
编辑2:不接受意味着如果阵列中有0字节,它将无缘无故发送。
编辑3:我使用来自莫斯科的Vlad的方法的修改版本解决了这个问题。下面。还要感谢所有帮助过我的人:)
编辑4:如果有人关心:该项目正在使用蓝牙设置基于AVR的闹钟。
答案 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