C语言实现 atoi atof


/**
  * @功能说明: 把参数 str 所指向的字符串转换为一个整数(类型为 int 型)。
  *
  * @参数:     str -- 要转换为整数的字符串。
  *
  * @返回值:   返回转换后的整数,如果没有执行有效的转换,则返回零。
  */
int myatoi(const char* str)
{
    char flag = 1;
    uint32_t data = 0;

    while(*str == ' ')//去除多余空格
    {
        str++;
    }

    if(*str == '-')
    {
        flag = -1;
        str++;
    }
    else if(*str == '+')
    {
        str++;
    }

    while(*str != '\0')
    {
        if(*str >= '0' && *str <= '9')
        {
            data = 10 * data + *str - '0';
        }
        else
        {
            break;
        }
        str++;
    }

    return flag * data;
}


/**
  * @功能说明: 把参数 str 所指向的字符串转换为一个浮点数(类型为 double 型)。
  *
  * @参数:     str -- 要转换为整数的字符串。
  *
  * @返回值:   返回转换后的双精度浮点数,如果没有执行有效的转换,则返回零(0.0)。
  */
double myatof(const char* str)
{
    uint8_t flag = 0;//正数 flag = 0;负数flag = 1;小数部分标识flag |= 0x80;
    double data = 0;
    double decPow = 0.1;//小数部分的幂

    while(*str == ' ')//去除多余空格
    {
        str++;
    }

    switch(*str)
    {
        case '+':
            str++;
            break;
        case '-':
            flag = 1;
            str++;
            break;
        case '.':
            flag |= 0x80;
            str++;
            break;
        default:
            break;
    }

    while(*str != '\0')
    {
        if(*str >= '0' && *str <= '9')
        {
            if(flag & 0x80)//小数部分
            {
                data += (*str - '0') * decPow;
                decPow /= 10;
            }
            else//整数部分
            {
                data = data * 10 + *str - '0';
            }
        }
        else if(*str == '.')//小数部分标识
        {
            if(flag & 0x80)//出现多个 . 则退出
            {
                break;
            }
            flag |= 0x80;
        }
        else
        {
            break;
        }
        str++;
    }

    return flag & 0x7F ? -data : data;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>

///atoi测试
void test12(void)
{
    char* str = "   456";

    printf("A = %d\n", myatoi(str));
    printf("B = %d\n", atoi(str));
}


///atof测试
void test13(void)
{
    char* str = "    +.1120/...00012";
    printf("A = %f\n", myatof(str));
    printf("B = %f\n", atof(str));
}

int main()
{
    test12();
    test13();

    return 0;
}

![(https://img-blog.csdnimg.cn/20210526141612323.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1NjA3ODcz,size_16,color_FFFFFF,t_70)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值