单片机C语言(字符串转为数字)组件


___虽然简单,但好记性不如烂笔头___
//把字符串转为数字
//支持16进制转换,但是16进制字母必须是大写的,且格式为以0X开头的.
//不支持负数 
//*str:数字字符串指针
//*res:转换完的结果存放地址.
//返回值:0,成功转换完成.其他,错误代码.
//1,数据格式错误.2,16进制位数为0.3,起始格式错误.4,十进制位数为0.
unsigned char str2num(unsigned char  *str,unsigned int *res)
{
    unsigned int t;
    unsigned char bnum=0;    //数字的位数
    unsigned char *p;          
    unsigned char hexdec=10;//默认为十进制数据
    p=str;
    *res=0;//清零.
    while(1)
    {
        if((*p<='9'&&*p>='0')||(*p<='F'&&*p>='A')||(*p=='X'&&bnum==1))//参数合法
        {
            if(*p>='A')hexdec=16;    //字符串中存在字母,为16进制格式.
            bnum++;                    //位数增加.
        }else if(*p=='\0')break;    //碰到结束符,退出.
        else return 1;                //不全是十进制或者16进制数据.
        p++; 
    } 
    p=str;                //重新定位到字符串开始的地址.
    if(hexdec==16)        //16进制数据
    {
        if(bnum<3)return 2;            //位数小于3,直接退出.因为0X就占了2个,如果0X后面不跟数据,则该数据非法.
        if(*p=='0' && (*(p+1)=='X'))//必须以'0X'开头.
        {
            p+=2;    //偏移到数据起始地址.
            bnum-=2;//减去偏移量     
        }else return 3;//起始头的格式不对
    }else if(bnum==0)return 4;//位数为0,直接退出.      
    while(1)
    {
        if(bnum)bnum--;
        if(*p<='9'&&*p>='0')t=*p-'0';    //得到数字的值
        else t=*p-'A'+10;                //得到A~F对应的值        
        *res+=t*usmart_pow(hexdec,bnum);           
        p++;
        if(*p=='\0')break;//数据都查完了.    
    }
    return 0;//成功转换
}

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM