keil里面itoa函数

swamsea 2012-04-15 05:49:27
下面是我在keil里面自己写的itoa函数,前提是这里不涉及有符号的数,请问要怎么改下面这个程序
char *itoa(int value,char *str,int redix)
{
uint j,k;
// string *string1;
uchar xdata p[30];
for(j=0;value!=0;j++)
{
p[j]=value%2;
value=value/2;

}
for(k=j-1;k>=0;j--)
{
sprintf(sumsz,"%.30s",p[k]);
}

return sumsz;
}
上面这样做肯定行不通,这里的sumsz是一个uchar数组,我要怎么改才能把得到的二进制数送到sumsz中,求指教
...全文
2548 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
dceacho 2012-04-15
  • 打赏
  • 举报
回复
我有一个C文件,不知道符不符合楼主要求
用到一个全局数组

主要函数
uint8_t * ltos(需要的字符长长度,左对齐或者又对齐,LONG型数据)

假设需要将12345转换成4个字符的字符串则可以直接在程序中
strcpy(stra,ltos(4,AL,12345);

[code=C/C++]


#include <stdint.h>
#include "user.h"
#include "stringx.h"

uint8_t strbuf[32];

uint8_t * ltos(uint8_t lenth,bool lr,long num)
{
bool s;
uchar i,j;
for(i=0;i<17;i++)strbuf[i]=0;
if(lenth>16)lenth=16;
if(num<0){num=-num;s=1;}else s=0;
for(i=0;i<lenth;i++)
{
strbuf[15-i]=num%10+'0';
num/=10;
} //0000,0000,'0'1'2'3','4'5'6'7'
for(i=0;i<16;i++)
{
if(strbuf[0]==0) //前面没有%10+'0'的部分
{
for(j=0;j<16;j++)strbuf[j]=strbuf[j+1]; //数组整体左移
}
} //'0'1'2'3','4'5'6'7',0000,0000
if(lr==AL) //靠左显示
{
if(s==1)
{
strbuf[0]='-';
for(i=1;i<lenth;i++)
{
if(strbuf[1]=='0') //去掉左边的无效'0'
{
for(j=1;j<16;j++)strbuf[j]=strbuf[j+1];//数组整体左移
}else break; //'1'2''3'4','5'6'7'0,0000,0000
}
}
else
{
for(i=0;i<lenth;i++)
{
if(strbuf[0]=='0') //去掉左边的无效'0'
{
for(j=0;j<16;j++)strbuf[j]=strbuf[j+1];//数组整体左移
}else break;; //'1'2''3'4','5'6'7'0,0000,0000
}
}
if(strbuf[0]==0)strbuf[0]='0';
}
else //靠右显示 //'0'1'2'3','4'5'6'7',0000,0000
{
if(s==1)
{
strbuf[0]='-';
for(i=1;i<(lenth-1);i++)//清除左边的'0'
{
if(strbuf[i]=='0'){strbuf[i]=strbuf[i-1];strbuf[i-1]=' ';}
else break;
}
}
else
{
for(i=0;i<(lenth-1);i++)//当要显示的值为0时不能清除
{
if(strbuf[i]=='0')strbuf[i]=' '; //位数不足左边用空格填充,('~'+2)1'2'3','4'5'6'7',0000,0000
else break;
}
}
if(strbuf[lenth-1]==' ')strbuf[lenth-1]=0;
}
return strbuf;
}

//将num转换成小数字符串 -123-->-0.0123
uint8_t * ftos4(long num)
{
if(num<0){strbuf[0]='-';num=-num;}else strbuf[0]=' ';
strbuf[1]=(num/10000)%10+'0';
strbuf[2]='.';
strbuf[3]=(num/1000)%10+'0';
strbuf[4]=(num/100)%10+'0';
strbuf[5]=(num/10)%10+'0';
strbuf[6]=num%10+'0';
strbuf[7]=0;
return strbuf;
}

uint8_t * ftos5(long num)
{
if(num<0){strbuf[0]='-';num=-num;}else strbuf[0]=' ';
strbuf[1]=(num/100000)%10+'0';
strbuf[2]='.';
strbuf[3]=(num/10000)%10+'0';
strbuf[4]=(num/1000)%10+'0';
strbuf[5]=(num/100)%10+'0';
strbuf[6]=(num/10)%10+'0';
strbuf[7]=num%10+'0';
strbuf[8]=0;
return strbuf;
}

/*----------------------------------------------------------
FunctionName: ftos32
Description: 将 num转换成小数字符串,3位整数,2位小数.123456-->"234.56"
Parameter:
Return:
Note:
----------------------------------------------------------*/
uint8_t * ftos32(long num)
{
if(num<0){strbuf[0]='-';num=-num;}else strbuf[0]=' ';
strbuf[1]=(num/10000)%10+'0';
if(strbuf[1]=='0')
{
if(strbuf[0]=='-')
{
strbuf[0]=' ';strbuf[1]='-';
}
else strbuf[1]=' ';
}

strbuf[2]=(num/1000)%10+'0';
if(strbuf[2]=='0')
{
if(strbuf[1]==' ')strbuf[2]=' ';
else if(strbuf[1]=='-')
{
strbuf[1]=' ';
strbuf[2]='-';
}
}

strbuf[3]=(num/100)%10+'0';
strbuf[4]='.';
strbuf[5]=(num/10)%10+'0';
strbuf[6]=num%10+'0';
strbuf[7]=0;
return strbuf;
}

/*----------------------------------------------------------
FunctionName:
Description: 给一个数字字符串中间插入小数点,n为小数位数
Parameter:
Return:
Note: 数字个数长度不得超过64
如果字符串是靠左显示则-7-->-0.7可能会出问题
----------------------------------------------------------*/
uint8_t * addp(uint8_t *ptr,uint8_t n)
{
uint8_t i,j,p;
uint8_t err[2]={0,0};
for(i=0;i<64;i++)//寻找结束符
{
if(ptr[i]==0)break;
}
j=p=i;
if(i>60)return err;//!
ptr[j+1]=0;//结束符后移一位
for(i=0;i<n;i++)//有1位小数需要移动1次
{
ptr[j]=ptr[j-1];
j--;
}
ptr[j]='.';
if(ptr[j-1]==' ')ptr[j-1]='0';//补零,1-->0.1
else if(ptr[j-1]=='-'){ptr[j-1]='0';ptr[j-2]='-';}//靠左显示的话会出问题
return ptr;
}

[/CODE]

27,517

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧