我在51上写了一个拆字函数,很菜,请各位大神批评指教!

2020-01-27 11:20发布

函数是将一个float数拆分到一个数组中,

  1. #include "stdio.h"
  2. //#include "reg51.h"
  3. #include "math.h"
  4. //拆字函数
  5. //入口变量ft ,n浮点数据,小数点保留位数
  6. //传出参数 m,字符位数
  7. unsigned char tempd[20]={0,0,0,0,0,0,0,0,0,0,0,0};
  8. unsigned char SpeaData(float ft,unsigned char n)
  9. {
  10.         unsigned char i=0;
  11.         unsigned long int temp=0;
  12.         double t;
  13.         unsigned char m=0,ss=48;

  14.        
  15.         //for(i=0;i<n;i++)       
  16.         //ft=ft*pow(10,n);
  17.         //拆分整数部分
  18.         if(ft<0)
  19.         {
  20.                 tempd[m++]='-';
  21.                 ft=0-ft;
  22.                 temp=(unsigned long int)ft;
  23.         }
  24.                 for(i=0;pow(10,i)<temp;i++);

  25.                 do
  26.                 {
  27.                         t=pow(10,i-1);
  28.                         t=(double)temp/t;
  29.                         t=(unsigned int)t%10;
  30.                         tempd[m++]=(unsigned char)t+48;
  31.                         //tempd[m++]=(unsigned char)((unsigned int)(temp/(unsigned long int)pow(10,i-1))%10);

  32.                         i--;
  33.                 }while(i);
  34.                 //拆分小数部分
  35.                  if(n)
  36.                 {
  37.                 tempd[m++]='.';
  38.                 ft=ft-(long int)ft;
  39.                 ft=ft*pow(10,n);
  40.                 temp=(unsigned long int)ft;
  41.                  do
  42.                 {
  43.                         t=pow(10,n-1);
  44.                         t=(double)temp/t;
  45.                         t=(unsigned int)t%10;
  46.                         tempd[m++]=(unsigned char)t+48;
  47.                         //tempd[m++]=(unsigned char)((unsigned int)(temp/(unsigned long int)pow(10,i-1))%10);

  48.                         n--;
  49.                 }while(n);
  50.                 }
  51.                 return m;
  52. }
  53. main()
  54. {
  55. unsigned char n=SpeaData(-9999.12345,4);
  56.         while(1);
  57. }
复制代码运行发现有时候又乱码,不知道是什么地方的问题,例如我现在输入的9999.12345.拆完之后小数后面就会有乱码出现。求解!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
10条回答
Tliang
1楼-- · 2020-01-27 14:50
这个直接用STDIO.H里面的sprintf(&Buf, "%f", value)就可以完成了。
guwu454
2楼-- · 2020-01-27 16:20
Tliang 发表于 2013-1-14 08:29
这个直接用STDIO.H里面的sprintf(&Buf, "%f", value)就可以完成了。

哥,我这个是拆下来以后准备送到12864里面显示的,而且这个代码是写在单片机里的!
Tliang
3楼-- · 2020-01-27 17:39
guwu454 发表于 2013-1-14 08:56
哥,我这个是拆下来以后准备送到12864里面显示的,而且这个代码是写在单片机里的! ...

得,你这口气我也懒得解释了
lxvtag
4楼-- · 2020-01-27 23:28
用sprintf()是最简单的,就是对单片机来说占内存有点大。写液晶乱码检查数组是不是越界了,字符串数组别忘了结束符。
guwu454
5楼-- · 2020-01-27 23:50
 精彩回答 2  元偷偷看……
guwu454
6楼-- · 2020-01-28 05:14
lxvtag 发表于 2013-1-14 09:22
用sprintf()是最简单的,就是对单片机来说占内存有点大。写液晶乱码检查数组是不是越界了,字符串数组别忘 ...

所以我做的是能够返回数据长度的,这样在现实的时候就知道要写多长了,也能确定我显示的起始位置了。

一周热门 更多>