C语言编程实现,浮点型与字符数组相互转化

本文介绍了一种不使用标准库函数的方法,将字符型表示的浮点数转换为实际的浮点数值。通过循环和递归的方式分别处理小数点前后的数字部分,并详细解释了代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

欢迎转载,请注明出处,本文地址: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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值