atof函数的实现

/*************************************************************************
> File Name: atof.c
> Author: zhanglp
> Mail: ql.zhanglp@qq.com
> Created Time: 2014年09月28日 星期日 13时59分55秒

 ************************************************************************/

#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>

double myAtof (const char *nptr)
{
    double  res_i = 0; // integer
    double  res_d = 1; // decimal
    const char    *p = nptr;

    while ( isdigit (*p) ) {

        res_i = res_i * 10 + (*p++ - '0');
    }


    if ( '.' == *p++ ) {

        while ( isdigit (*p) ) {
            
            res_i += (res_d /= 10) * (*p++ - '0');
        }
    }

    return res_i;
}


int main (void)
{
    const char  *str = "143.43254354353425345432";


    printf ("myAtof: %f\n", myAtof (str));
    printf ("atof  : %f\n", atof (str));

    return 0;

}

74.125.205.147

atof函数用于将字符串转换为双精度浮点数,其逻辑实现原理可以概括为以下几个关键步骤: #### 1. 跳过空白字符 函数首先会跳过字符串开头的空白字符,如空格、制表符、换行符等。这些字符不会影响最终的转换结果。 #### 2. 处理符号 接着,函数会检查字符串中是否存在正负号(`+` 或 `-`)。如果存在正号,忽略它;如果存在负号,记录下该字符串表示的是一个负数。 #### 3. 解析整数部分 函数开始解析字符串中的数字部分,直到遇到非数字字符(除了小数点和指数符号)。将这些数字字符转换为对应的整数值。 #### 4. 处理小数点 如果遇到小数点,函数会继续解析小数点后的数字部分,将其转换为小数部分。通过适当的移位操作,将小数部分合并到整数部分中。 #### 5. 处理指数部分 函数会检查是否存在指数符号(`e` 或 `E`)。如果存在,继续解析指数部分的数字,并根据指数的正负对之前得到的数值进行相应的缩放。 #### 6. 处理异常情况 如果在解析过程中遇到非数字字符(除了允许的符号),函数会停止解析,并将已经解析的部分作为最终结果返回。如果字符串为空或不包含有效的数字信息,函数通常返回 0.0。 以下是一个简化的 atof 函数实现示例: ```c #include <stdio.h> #include <ctype.h> double my_atof(const char *str) { double result = 0.0; int sign = 1; int exp_sign = 1; int exp = 0; // 跳过空白字符 while (isspace(*str)) { str++; } // 处理符号 if (*str == '-') { sign = -1; str++; } else if (*str == '+') { str++; } // 解析整数部分 while (isdigit(*str)) { result = result * 10 + (*str - '0'); str++; } // 处理小数点 if (*str == '.') { str++; double factor = 0.1; while (isdigit(*str)) { result += (*str - '0') * factor; factor /= 10; str++; } } // 处理指数部分 if (*str == 'e' || *str == 'E') { str++; if (*str == '-') { exp_sign = -1; str++; } else if (*str == '+') { str++; } while (isdigit(*str)) { exp = exp * 10 + (*str - '0'); str++; } for (int i = 0; i < exp; i++) { if (exp_sign == 1) { result *= 10; } else { result /= 10; } } } return result * sign; } ``` 可以使用以下方式调用这个函数: ```c int main() { const char *str = "123.45e-2"; double num = my_atof(str); printf("Converted number: %f\n", num); return 0; } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值