jianhong_wu 发表于 2015-9-13 01:16:51

带小数点的字符串如何转换成变量,谁有此转换算法的参考程序?已解答。

小明-陕西:
问下,我想串口发送这个字符串,但是里面那个123.4想变成一个变量怎么弄?

★坚鸿-深圳:
字符串“123.4”转换成unsigned int变量1234,这是最常用的算法,不要用任何库涵数,要自己动脑写转换算法,否则一辈子都不提高。分析步骤如下:
(1)字符串“123.4”先过滤小数点变成字符串“1234”
(2)任何数字字符减去字符“0”就等于它的变量本身。比如字符“5”减去“0”就等于变量5。
我写的转换算法参考代码如下:
#include "REG52.H"


//const unsigned char *pu8StringBuffer 代表被转换的字符串数组
//unsigned char u8StringSize 代表数组的有效位数
//unsigned long *pu32ResultData 代表转换后的结果数据。必须加&符号带入此函数形参,表示传址。
//unsigned char *pu8ResultDotSize 代表转后结果数据的小数点数。必须加&符号带入此函数形参,表示传址。
void string_to_data(const unsigned char *pu8StringBuffer,unsigned char u8StringSize,unsigned long *pu32ResultData,unsigned char *pu8ResultDotSize);


unsigned char aaaa1[]="123.4";

unsigned long Gu32Data;//转换后的变量数值结果
unsigned char Gu8Dot;    //转换后的变量所带的小数点个数

void main() //主程序
{
   //注意,Gu32Data和Gu8Dot要加&符号代表传地址给指针
   string_to_data(aaaa1,5,&Gu32Data,&Gu8Dot);

   while(1);
}

//const unsigned char *pu8StringBuffer 代表被转换的字符串数组
//unsigned char u8StringSize 代表数组的有效位数
//unsigned long *pu32ResultData 代表转换后的结果数据。必须加&符号带入此函数形参,表示传址。
//unsigned char *pu8ResultDotSize 代表转后结果数据的小数点数。必须加&符号带入此函数形参,表示传址。
void string_to_data(const unsigned char *pu8StringBuffer,unsigned char u8StringSize,unsigned long *pu32ResultData,unsigned char *pu8ResultDotSize)
{
      unsigned char i;
      unsigned char k;
          unsigned char u8DotSize;
          unsigned char u8DotFlag;
          unsigned long u32Data;
          unsigned long u32Temp;
          unsigned long u32TenTimes;
                unsigned char u8DataBuffer; //数组缓存

       

          k=0;
                u8DotSize=0; //记录小数点数
                u8DotFlag=0; //有小数点的标志
          for(i=0;i<u8StringSize;i++)
                {
                   if(pu8StringBuffer>='0'&&pu8StringBuffer<='9') //只收留数字,过滤其它干扰字符
                   {
                      u8DataBuffer=pu8StringBuffer;//去掉干扰字符,左对齐
                          k++;//k也是当前的有效数据

                          if(1==u8DotFlag) //表示当前的是小数点后面的数据
                          {
                             u8DotSize++; //统计小数点后的位数
                          }
                   }
                   elseif('.'==pu8StringBuffer) //如果是小数点
                   {
                          u8DotFlag=1; //标志位置1,代表后面的数据都是小数点数据了
                   }
               
                }


          u32Data=0;//转换的变量结果
      u32Temp=0; //临时中间变量
      u32TenTimes=1;//不断以10倍放大,代表后面个十百千万的位数
                for(i=0;i<k;i++) //此时k是有效数据的个数
                {
                   //减去'0'是字符转换成变量,同时让一个char的数据放到一个long类型的临时变量u32Temp里,避免乘法溢出
                   u32Temp=u8DataBuffer-'0';
                   u32Data=u32Data+u32Temp*u32TenTimes;
                   u32TenTimes=u32TenTimes*10; //以10倍不断放大的系数,代表后面个十百千万的位数
                }


      *pu32ResultData=u32Data;   //把数据的转换结果输出
      *pu8ResultDotSize=u8DotSize; //把小数点个数的转换结果输出

}



页: [1]
查看完整版本: 带小数点的字符串如何转换成变量,谁有此转换算法的参考程序?已解答。