调用sprintf函数将实数打印到字符串及手动实现实数转字符串函数 ------ ftoa

 

 1 #define _CRT_SECURE_NO_WARNINGS
 2 #include<stdio.h>
 3 #include<stdlib.h>
 4 
 5 char *ftoa(double db, char *str);// 手动实现将实数转化为字符串
 6 
 7 // 实数转字符串
 8 void main()
 9 {
10     double db = -12345.875;
11     char str[200];
12     sprintf(str,"%f",db);// sprintf 将实数打印到字符串
13     printf("%s\n",str);
14 
15     ftoa(db, str);
16     printf("%s\n", str);
17     system("pause");
18 }
19 
20 // 手动实现将实数转化为字符串
21 char * ftoa(double db, char *str)
22 {
23     char *istr = str;//备份首地址
24     if (db < 0)
25     {
26         *str = '-';//是负数
27         db *= -1;///负数转化为正数
28         str++;//指针向前移动
29     }
30 
31     //12345   .    456
32     //-12345
33     int num = (int)db;//取出整数
34     int  wei = 0;
35     for (int inum = num; inum; inum /= 10)
36     {
37         wei++;//取出位数
38     }
39     //12345
40     //5
41     //1234 %10 4
42     for (int i = wei - 1; i >= 0; i--, num /= 10)//填充了整数位
43     {
44         str[i] = num % 10 + '0';
45 
46     }
47     str += wei;
48     *str = '.';//处理小数点
49     //str[wei] = '\0';
50 
51     double xiaoshu = db - (int)db;//取出小数
52     int  xiaoshuwei = 0;
53     //0.123   1.23  1   12.3 12  123 123
54     //取出小数位
55     //ixiaoshu != (int)ixiaoshu精确描述
56 
57     for (double ixiaoshu = xiaoshu; ixiaoshu != (int)ixiaoshu; ixiaoshu *= 10)
58     {
59         //printf("\n%f", ixiaoshu - (int)ixiaoshu);
60 
61         xiaoshuwei++;
62         if (xiaoshuwei>6)
63         {
64             break;//限定精确度
65         }
66     }
67     //.123   1.23  -1    0.23
68     for (int i = 0; i < xiaoshuwei; i++)
69     {
70         xiaoshu *= 10;//1.23    2.3  3
71         int data = (int)xiaoshu;//1  2  3
72         //printf("\n%d", data);
73         xiaoshu -= data;//0.23  0.3   0
74         str++;
75         *str = data + '0';//指针向前移动
76     }
77     *(++str) = '\0';
78     return istr;
79 }

 

posted on 2015-05-13 16:43  Dragon-wuxl  阅读(637)  评论(0)    收藏  举报

导航