【C语言】atoi,atof的实现及改进

本文详细介绍了C语言中将字符串转换为整数(int)和浮点数(double)的函数atoi和atof的实现原理,包括基本版和改进版的代码实现。这些函数会跳过前导空白,处理正负符号,并进行数字转换。同时,文章也给出了atof函数处理小数部分的方法。对于可能出现的非法字符和超出范围的情况,函数会进行相应的处理。
摘要由CSDN通过智能技术生成

atoi

注意:使用该函数时要注意atoi返回的是int类型,注意输入str的范围不要超出int类型的范围。字符串str不能出现非法字符,也不能出现多个符号字符(多个减号/加号)。

/** \brief  把参数 str 所指向的字符串转换为一个整数(类型为 int 型)。
 *
 * \param   str -- 要转换为整数的字符串。
 * \return 	该函数返回转换后的长整数,如果没有执行有效的转换,则返回零。
 *
 */
int latoi(const char *str)
{
    int num = 0;
    char sign = 1;

    //跳过左边空白字符
    while(*str == ' ')
    {
        str++;
    }

    //判断有无符号位
    if(*str == '-' || *str == '+')
    {
        if(*str == '-')
            sign = -1;
        str++;
    }

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

    return num * sign;
}

改进的atoi

注意:使用该函数时要注意atoi返回的是int类型,注意输入str的范围不要超出int类型的范围。转化时跳过前面的空格等空字符,直到遇上数字或正负符号才开始做转换, 而再遇到非数字或字符串结束标志(’/0’)才结束转换,并将结果返回。

/** \brief  把参数 str 所指向的字符串转换为一个整数(类型为 int 型)。
 *              转化时跳过前面的空格等空字符,直到遇上数字或正负符号才开始做转换,
 *              而再遇到非数字或字符串结束标志('/0')才结束转换,并将结果返回。
 *
 * \param   str -- 要转换为整数的字符串。
 * \return 该函数返回转换后的长整数,如果没有执行有效的转换,则返回零。
 *
 */
int latoi(const char *str)
{
    int num = 0;
    char sign = 1;

    //跳过左边非法字符
    while(*str != '\0')
    {
        if(*str > '0' && *str < '9')
            break;
        else if(*str == '-' || *str == '+')
        {
            break;
        }
        str++;
    }

    //判断符号位
    while(*str == '-' || *str == '+')
    {
        if(*str == '-')
            sign *= -1;
        str++;
    }

    while(*str != '\0')
    {
        if(*str >= '0' && *str <= '9')
        {
            num *= 10;
            num += (*str - '0');
        }
        //跳过数字中的空格字符
        else if(*str != ' ')
            break;
        str++;
    }

    return num * sign;
}

atof

/** \brief  把参数 str 所指向的字符串转换为一个浮点数(类型为 double 型)。
 *
 * \param   str -- 要转换为浮点数的字符串。
 * \return  函数返回转换后的双精度浮点数,如果没有执行有效的转换,则返回零(0.0)。
 *
 */
double latof(const char *str)
{
    double num = 0;
    double dec = 0;
    char flag = 0;
    char sign = 1;
    double pow = 0.1;

    //跳过左边空白字符
    while(*str == ' ')
    {
        str++;
    }

    //判断有无符号位
    if(*str == '-' || *str == '+' || *str == '.')
    {
        if(*str == '-')
            sign = -1;
        //小数标志
        else if(*str == '.')
            flag = 1;
        str++;
    }

    while(*str != '\0')
    {
        if(*str >= '0' && *str <= '9')
        {
            //小数部分
            if(flag == 1)
            {
                dec += (*str - '0') * pow;
                pow /= 10;
            }
            //整数部分
            else
            {
                num *= 10;
                num += (*str - '0');
            }
        }
        else if(*str == '.')
        {
            if(flag == 1)
                break;
            flag = 1;
        }
        else if(*str != ' ')
            break;
        str++;
    }
    num += dec;

    return num * sign;
}

改进的atof

/** \brief  把参数 str 所指向的字符串转换为一个浮点数(类型为 double 型)。
 *              转化时跳过前面的空格等空字符,直到遇上数字、正负符号和小数符号才开始做转换,
 *              而再遇到非数字或字符串结束标志('/0')才结束转换,并将结果返回。
 *
 * \param   str -- 要转换为浮点数的字符串。
 * \return  函数返回转换后的双精度浮点数,如果没有执行有效的转换,则返回零(0.0)。
 *
 */
double latof(const char *str)
{
    double num = 0;
    double dec = 0;
    char flag = 0;
    char sign = 1;
    double pow = 0.1;

    //跳过左边非法字符
    while(*str != '\0')
    {
        if(*str > '0' && *str < '9')
            break;
        else if(*str == '-' || *str == '+' || *str == '.')
        {
            break;
        }
        str++;
    }

    //判断符号位
    while(*str == '-' || *str == '+' || *str == '.')
    {
        if(*str == '-')
            sign *= -1;
        else if(*str == '.')
            flag = 1;
        str++;
    }

    while(*str != '\0')
    {
        if(*str >= '0' && *str <= '9')
        {
            //小数部分
            if(flag == 1)
            {
                dec += (*str - '0') * pow;
                pow /= 10;
            }
            //整数部分
            else
            {
                num *= 10;
                num += (*str - '0');
            }
        }
        else if(*str == '.')
        {
            if(flag == 1)
                break;
            flag = 1;
        }
        else if(*str != ' ')
            break;
        str++;
    }
    num += dec;

    return num * sign;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值