C语言模拟实现atoi函数

atoi函数,主要功能是将一个字符串转变为整数,例如将“12345”–>12345。但在实现过程中,我们难免会因为考虑不够全面而漏掉比较重要的几点,今天就总结一下实现atoi函数需要注意的地方。

1.指针为NULL
2.字符串为空字符串
3.空白字符
4.正号与负号问题
5.溢出问题
6.异常字符处理

接下来看代码:(具体几种问题处理都在代码的注释中说明)

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <assert.h>

//定义两个枚举常量来表示状态
enum STATE
{
    VALID,  //合法
    INVALID,//非法
};
enum STATE state = INVALID;
int my_atoi(const char *str)
{
    int flag = 1;
    long long ret = 0;//定义为比int存储范围还要大的类型,防止后面判断溢出时出错。
    //空指针
    assert(str);
    //空字符串
    if (*str == "\0")
    {
        return 0;
    }
    //空白字符
    while (isspace(*str))//用函数isspace判断是否为空白字符
    {
        str++;
    }
    //遇到正负号
    if (*str == '-')
    {
        flag = -1;
        str++;
    }
    if (*str == '+')
    {
        str++;
    }
    //
    while (*str)
    {
        //if (*str >= '0'&&*str <= '9')
        if (isdigit(*str))//用函数isdigit判断是否为数字字符
        {
            ret = ret * 10 + flag*(*str - '0');
            //判断是否溢出
            if (ret > INT_MAX || ret < INT_MIN)
            {
                return ret;
            }
        }
        //异常字符
        else
        {
            break;
        }
        str++;
    }
    state = VALID;
    return ret;
}
int main()
{
    char *p = "12345";
    char *q = "  -12345";
    int ret = my_atoi(p);
    int ret2 = my_atoi(q);
    printf("%d\n", ret);
    printf("%d\n", ret2);
    system("pause");
    return 0;
}

运行结果:

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值