欢迎转载,请注明出处,本文地址:http://blog.youkuaiyun.com/jk050802/article/details/8628764
联系邮箱:yinfork@foxmail.com
简介
从浮点型转换为字符型:这里比较简单,只需要用到sprintf即可。sprintf(str,"%f",dou_num);
从字符型转换为浮点型:这里也比较简单,只用sscanf即可。例如:sscanf(str,"%lf",&res_dou_num);
之前没有想到这个sscanf函数,因此下面把字符型转换为浮点型的函数是自己写的。
把一个字符型表示的数字转换为实际上的数字,根据ASSIC表,把字符型表示的数字减去48即可。
而浮点型有点特殊,要分为小数点之前和小数点之后来处理。
小数点之前:通过循环,从左向右读,将左边已有的数乘以10,再加上后面右边的数。
小数点之后:通过递归,从右向左读,将右边已有的数除以10,再加上左边的数。
总结
这里可以看出循环与递归的区别,有时候想把循环时候操作的顺序反过来,可以采用递归来实现。
对于字符数组,它会有一个str_ptr指针,这个指针代表现在读到字符型数组的那个字符上去。假如在子函数dou_post等对其进行str_ptr++,这是不会让实际的str_ptr增加1,虽然这个是一个指针,但是这个只是形参,而不是实参,因此不会增加1。假如想让str_ptr加1,那么就要传递str_ptr的地址给子函数dou_post,即参数应该是**str_ptr。
示例代码
#include<stdio.h>
#defineMAX_BUFFER 100
#defineNONE 0
#defineHAVE 1
staticint dou_post(char **str_ptr)
{
int post_num = 0;
while((**str_ptr >='0')&&(**str_ptr <= '9')){
post_num = post_num * 10;
post_num += (**str_ptr - 48);
(*str_ptr)++;
}
if(**str_ptr == '.') (*str_ptr)--;
return post_num;
}
staticdouble dou_point(char **str_ptr)
{
double point_num = 0;
if((**str_ptr >='0')&&(**str_ptr <= '9')){
point_num = **str_ptr - 48;
(*str_ptr)++;
if((**str_ptr >='0')&&(**str_ptr <= '9')){
point_num += dou_point(str_ptr);
}
}
if(**str_ptr == '\0') (*str_ptr)--;
return point_num / 10;
}
staticdouble str_to_dou(char *str_ptr)
{
int post_num = 0;
double point_num = 0;
int point_flag = NONE;
while(*str_ptr != '\0'){
if(*str_ptr == '.')
point_flag = HAVE;
else if(point_flag == NONE)
post_num =dou_post(&str_ptr);
else if(point_flag == HAVE)
point_num =dou_point(&str_ptr);
str_ptr++;
}
return (double)post_num + point_num;
}
intmain()
{
double dou_num;
char str[MAX_BUFFER];
double res_dou_num;
dou_num = 12546.697017;
printf("the double number is%f\n",dou_num);
sprintf(str,"%f",dou_num);
printf("from double to string,result is %s\n",str);
//sscanf(str,"%lf",&res_dou_num);
res_dou_num = str_to_dou(str);
printf("from string to double,result is %f\n",res_dou_num);
}
运行结果
[root@localhostdouble]# ./test
thedouble number is 12546.697017
fromdouble to string, result is 12546.697017
fromstring to double ,result is 12546.697017