[demo程序] 单片机C语言(字符串转为数字)组件

[复制链接]
 楼主| 杨寅辉 发表于 2019-10-30 22:02 | 显示全部楼层 |阅读模式
  1. //把字符串转为数字
  2. //支持16进制转换,但是16进制字母必须是大写的,且格式为以0X开头的.
  3. //不支持负数
  4. //*str:数字字符串指针
  5. //*res:转换完的结果存放地址.
  6. //返回值:0,成功转换完成.其他,错误代码.
  7. //1,数据格式错误.2,16进制位数为0.3,起始格式错误.4,十进制位数为0.
  8. unsigned char str2num(unsigned char  *str,unsigned int *res)
  9. {
  10.     unsigned int t;
  11.     unsigned char bnum=0;    //数字的位数
  12.     unsigned char *p;         
  13.     unsigned char hexdec=10;//默认为十进制数据
  14.     p=str;
  15.     *res=0;//清零.
  16.     while(1)
  17.     {
  18.         if((*p<='9'&&*p>='0')||(*p<='F'&&*p>='A')||(*p=='X'&&bnum==1))//参数合法
  19.         {
  20.             if(*p>='A')hexdec=16;    //字符串中存在字母,为16进制格式.
  21.             bnum++;                    //位数增加.
  22.         }else if(*p=='\0')break;    //碰到结束符,退出.
  23.         else return 1;                //不全是十进制或者16进制数据.
  24.         p++;
  25.     }
  26.     p=str;                //重新定位到字符串开始的地址.
  27.     if(hexdec==16)        //16进制数据
  28.     {
  29.         if(bnum<3)return 2;            //位数小于3,直接退出.因为0X就占了2个,如果0X后面不跟数据,则该数据非法.
  30.         if(*p=='0' && (*(p+1)=='X'))//必须以'0X'开头.
  31.         {
  32.             p+=2;    //偏移到数据起始地址.
  33.             bnum-=2;//减去偏移量     
  34.         }else return 3;//起始头的格式不对
  35.     }else if(bnum==0)return 4;//位数为0,直接退出.      
  36.     while(1)
  37.     {
  38.         if(bnum)bnum--;
  39.         if(*p<='9'&&*p>='0')t=*p-'0';    //得到数字的值
  40.         else t=*p-'A'+10;                //得到A~F对应的值        
  41.         *res+=t*usmart_pow(hexdec,bnum);           
  42.         p++;
  43.         if(*p=='\0')break;//数据都查完了.   
  44.     }
  45.     return 0;//成功转换
  46. }


aoyi 发表于 2019-11-13 10:02 | 显示全部楼层
非常感谢分享
drer 发表于 2019-11-13 10:23 | 显示全部楼层
非常感谢分享
天灵灵地灵灵 发表于 2020-2-10 17:33 | 显示全部楼层
貌似不错。
internally 发表于 2020-2-11 11:14 | 显示全部楼层
可以再完善一下,大小写都支持之类的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

39

主题

295

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部

39

主题

295

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部