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中,求指教
...全文
2183 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]
减少库的使用,解决那些需要小代码量,但苦恼于没有简易的字符串处理函数的郁闷 char *itoa_private(int val, char *buf, unsigned radix);//整数转字符串 int my_isdigit(int ch);//判断字符是否为数字 long long StrToInt(const char *s,int sign);//字符串转数字 int atoi_32(const char *s);//将字符串str转换为32位整型,其正数的最值为0x7FFFFFFF,负数的最小值为0x80000000,考虑数字会溢出的情况 void LettersChange(unsigned char*str, unsigned char font);//大小写字母变成大小写字母 signed int st_strlen(unsigned char* str);//获取字符串长度 signed int st_strcmp(unsigned char *s,unsigned char *t);//比较两个字符串大小 unsigned char *st_strcpy(unsigned char *t,unsigned char *s);//字符串拷贝 signed int st_strncmp(unsigned char *dest,unsigned char *src,unsigned int Len);//可变长度字符串大小比较 signed char st_toupper(unsigned char c);//小写字符转化为大写字符 unsigned char *st_strcat(unsigned char *s,unsigned char *t);//字符串连接 signed int st_memcpy(unsigned char *dest, unsigned char *src, unsigned int Len);//可变长度内存拷贝 signed int st_memset(unsigned char *dest,unsigned char byte, unsigned int Len);//设置长度为Len的内存块为byte signed int st_memcmp(unsigned char* dest, unsigned char* src, unsigned int Len);//内存段内数据比较 int gsmInvertNumbers(const char* pSrc, char* pDst, int nSrcLength);//正常顺序的字符串转换为两两颠倒的字符串,若长度为奇数,补'F'凑成偶数 int gsmSerializeNumbers(const char* pSrc, char* pDst, int nSrcLength);//两两颠倒的字符串转换为正常顺序的字符串 int gsmEncode7bit(const char* pSrc, unsigned char* pDst, int nSrcLength);//7bit编码 int gsmDecode7bit(const unsigned char* pSrc, char* pDst, int nSrcLength);//7bit解码 int gsmString2Bytes(const char* pSrc, unsigned char* pDst, int nSrcLength);//可打印字符串转换为字节数据 int gsmBytes2String(const unsigned char* pSrc, char* pDst, int nSrcLength);//字节数据转换为可打印字符串

27,370

社区成员

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

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