独闷闷网

 找回密码
 立即注册
搜索
查看: 434|回复: 0
收起左侧

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

[复制链接]
发表于 2015-9-13 01:16:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

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

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


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


  7. unsigned char aaaa1[]="123.4";

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

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

  14.    while(1);  
  15. }

  16. //const unsigned char *pu8StringBuffer 代表被转换的字符串数组
  17. //unsigned char u8StringSize 代表数组的有效位数
  18. //unsigned long *pu32ResultData 代表转换后的结果数据。必须加&符号带入此函数形参,表示传址。
  19. //unsigned char *pu8ResultDotSize 代表转后结果数据的小数点数。必须加&符号带入此函数形参,表示传址。
  20. void string_to_data(const unsigned char *pu8StringBuffer,unsigned char u8StringSize,unsigned long *pu32ResultData,unsigned char *pu8ResultDotSize)
  21. {
  22.         unsigned char i;
  23.         unsigned char k;
  24.             unsigned char u8DotSize;
  25.             unsigned char u8DotFlag;
  26.             unsigned long u32Data;
  27.             unsigned long u32Temp;
  28.               unsigned long u32TenTimes;
  29.                 unsigned char u8DataBuffer[15]; //数组缓存

  30.        

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

  40.                           if(1==u8DotFlag) //表示当前的是小数点后面的数据
  41.                           {
  42.                              u8DotSize++; //统计小数点后的位数
  43.                           }
  44.                    }
  45.                    else  if('.'==pu8StringBuffer[i]) //如果是小数点
  46.                    {
  47.                           u8DotFlag=1; //标志位置1,代表后面的数据都是小数点数据了
  48.                    }
  49.                  
  50.                 }


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


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

  63. }
复制代码



乐于分享,勇于质疑!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|独闷闷网 ( 粤ICP备12007667号-2 )

GMT+8, 2018-4-26 07:59 , Processed in 0.120897 second(s), 18 queries .

快速回复 返回顶部 返回列表