【atoi函数的模拟实现】【C语言】

发布于:2022-12-02 ⋅ 阅读:(727) ⋅ 点赞:(0)

atoi函数的模拟实现

int atoi(const char *str);//将所指向的字符串转换为一个整型(int)
  • 会跳过前面的空白字符。eg:( 123----输出123
  • 遇到字母就会停下来。eg:123ab34-----输出123
  • 会显示正负数。eg:(-123)-----输出(-123)
  • 不能转换为int或者为空字符串会返回0eg: acd----输出0
  • 越界会产生错误结果
int isspace(int c)如果判断字符是一个空白字符,则返回非零值ture,否则返回0(false
#include<stdio.h>
#include<assert.h>
#include<ctype.h>
#include<limits.h>//
//前面有空格会过滤掉
//遇到字母会停下来
//过大会报错
//会显示负数
//1.空指针
//2.空字符串
//3.空格
//+,-号
//非数字字符
//越界
//
enum Status
{
    VALID,
    INVALID
}sta=INVALID;//默认非法
int my_atoi(const char* str)
{
    int flag = 1;
    if (*str == '\0')
        return 0;//非法0
    //跳过空白字符
    while (isspace(*str))//isspace()如果判断字符是一个空白字符,则返回非零值ture,否则返回0(false
    {
        str++;
    }
    //判断正负号
    if (*str == '+')
    {
        flag = 1;
        str++;
    }
    else if (*str == '-')
    {
        flag = -1;
        str++;
    }

    long long ret = 0;//int的话越界那里存不下
    while (*str != '\0')
    {
        if (isdigit(*str))//是数字界进入循环
        {
            //越界呢?
            ret = ret * 10 + flag*(*str - '0');
            //-12
            // 0*10+(-1)*1=-1
            // -1*10+(-1)*2=-12
            //判断是否会越界
            if (ret >INT_MAX || ret <INT_MIN)
            {
                return 0;
            }
        }
        else
        {
            return (int)ret;
        }
        str++;//继续判断下一个字符
    }
    if (*str == '\0')
    {
        sta = VALID;
    }
    return (int)ret;
}
int main()
{
    char arr[200] = "123";
    int ret = my_atoi(arr);
    if (sta == INVALID)
    {
        printf("非法返回:%d\n", ret);
    }
    else if (sta == VALID)
    {
        printf("合法转换:%d\n", ret);

    }
    
    return 0;
}

网站公告

今日签到

点亮在社区的每一天
去签到