• 【c语言】atoi的模拟实现


    1.头文件

    atoi() 是 C语言的一个标准库函数,定义在头文件中

    2.atoi的解析

    具体来讲,atoi() 函数首先会丢弃尽可能多的空白字符,直至找到第一个非空白字符,然后从该字符开始,识别 “+”、“-” 以及 0-9 之间的十进制数,最后将它们转换成整数。如果构成整数的后面还有其它字符,这些字符将会被忽略。

    3.函数申明

    在这里插入图片描述
    参数
    string:指向要转换的字符串。
    如果由于 str 为空或者 str 字符串无法转换为整数,函数返回 0。

    如果字符串表示的值超出了 int 类型所能表示的整数范围,函数返回的数值是int 最大值或最小值。

    4.一些转化的例子

    1.如果前面有+,转化后+号去掉在这里插入图片描述


    2.如果是-号,则保留
    在这里插入图片描述


    3.传入的是空指针
    在这里插入图片描述

    在这里插入图片描述


    1. 有空格的话跳过
      在这里插入图片描述

    5.空字符串的转化在这里插入图片描述


    6.大于int类型最大值,转化为int类型的最大值
    在这里插入图片描述


    7.小于int类型最小值,转化为int类型的最小值
    在这里插入图片描述


    8.出现整数后面有其他字符截断.在这里插入图片描述


    9.先出现其他字符比如a
    在这里插入图片描述

    5.函数实现

    1.基本框架

    enum State//枚举类型定义转化是否正常
    {
    	INVALID,//不正常
    	VALID,//正常
    
    
    
    }sta= INVALID;//先让其正常
    int my_atoi(const char *str)//atoi的具体实现
    {
    
    
    
    
    
    }
    int main()
    {
    	char arr[] = "1234";
    	int ret = my_atoi(arr);//返回转化后的值
    	if (sta == INVALID)//不正常转化
    	{
    		printf("非正常转化-%d",ret);
    
    
    	}
    	if (sta == VALID)//正常转化
    	{printf("正常转化-%d", ret);
    	}
    
    
    
    
    
    
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    2.处理空指针

    int my_atoi(const char *str)//atoi的具体实现
    {assert(*str);//处理空指针
    }
    
    • 1
    • 2
    • 3

    3.处理空字符串

    int my_atoi(const char *str)
    {
    	assert(*str);
    	if (*str == '\0')//处理空字符串
    	{                //处理空字符串
    		return 0;    //处理空字符串
    
    
    	}
    
    
    
    
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    4.处理空格

    int my_atoi(const char *str)
    {
    	assert(*str);
    	if (*str == '\0')
    	{
    		return 0;
    
    
    	}
    	while (isspace(*str))//处理空格
    	{                    //处理空格
    		str++;            //处理空格
    	}
    
    
    
    
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    5.处理符号位

    int my_atoi(const char *str)
    {
    	assert(*str);
    	if (*str == '\0')
    	{
    		return 0;
    
    
    	}
    	while (isspace(*str))
    	{
    		str++;
    	}
    	int flag = 1;//符号位,如果为1则为正数,如果为-1则为负数,如果没加正号,默认为1;
    	if (*str=='+')
    	{
    		flag = 1;
    		str++;//跳过当前字符
    
    
    	}
    	else if (*str == '-')
    	{
    		flag = -1;
    		str++;//跳过当前字符
        }
    
    
    
    
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    6.处理数字字符

    int my_atoi(const char *str)
    {
    	assert(*str);
    	if (*str == '\0')
    	{
    		return 0;
    
    
    	}
    	while (isspace(*str))
    	{
    		str++;
    	}
    	int flag = 1;
    	if (*str=='+')
    	{
    		flag = 1;
    		str++;
    
    
    
    	}
    	else if (*str == '-')
    	{
    		flag = -1;
    		str++;
        }
    long long r=0;//如果r 为int类型的话,超出范围,可能要截断,这里初始话为0,保证了空字符串返回0
    	while (*str != '\0')//字符还未到末尾
    	{
    		if (isdigit(*str))//判断是否是字符
    		{
    			r = r * 10 + flag**str - '0';//得到字符对应的整数
    			if (r > INT_MAX || r < INT_MIN)//如果超出范围
    			{
    				if (flag == 1)
    				{
    					return INT_MAX;//超出int 最大值,就返回最大值
    
    				}
    				if (flag == -1)
    				{
    
    					return INT_MIN;//超出int 最小值,就返回最小值
    
    				}
    			
    			
    			}
    			str++;//指针移动下一个字符
    
    
    
    
    
    		}
    		else
    		{
    			return r;//如果str指向的不是字符的话,就返回r的值,比如1234a,此时r=1234
    		}
    
    
    
    
    
    
    
    	}
    
    
    
    
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74

    6.整体代码

    #include
    #include 
    #include 
    #include 
    #include
    enum State
    {
    	VALID,
    	INVALID
    
    
    }sta= INVALID;
    int my_atoi(const char* str)
    {
    	assert(*str);
    	if (*str == '\0')
    	{
    
    		return 0;
    
    
    	}
    	while (isspace(*str))
    	{
    		str++;
    	}
    	int flag = 1;
    	if (*str == '+')
    	{
    		flag = 1;
    		str++;
    
    
    	}
    	else if (*str == '-')
    	{
    		flag = -1;
    		str++;
        }
    	long long r = 0;
    	while (*str != '\0')
    	{
    		if (isdigit(*str))
    		{
    			r = r*10+(*str-'0')*flag;
    			if (r > INT_MAX || r < INT_MIN)
    			{
    				if (flag == 1)
    				{
    					return INT_MAX;
    
    
    				}
    				else if (flag == -1)
    				{
    					return INT_MIN;
    				}
    
    				
    
    			}
    
    			str++;
    
    		}
    		else
    		{
    			return r;
    		}
    		
    
    
    
    
    	}
    	
    		sta = VALID;
         
    	return (int)r;
    
    
    
    
    
    
    }
    
    
    
    int main()
    {
    	char arr[] = "a111";
        int ret=my_atoi(arr);
    	if (sta == VALID)
    	{
    		printf("正常输出%d",ret);
    
    
    
    	}
    	if (sta == INVALID)
    	{
    		printf("非正常输出%d",ret);
    
    	}
    
    
    
    
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
  • 相关阅读:
    隐私保护协议
    c语言实现数据结构---树的基础概念
    HTML5期末考核大作业:基于Html+Css+javascript的网页制作(化妆品公司网站制作)
    【车载开发系列】GIT教程---如何下载代码库
    【BOOST C++ 17 出错处理】(3) Boost.Exception
    GitHub如何删除仓库
    微信小程序使用lime-echart踩坑记录
    sonarqube二次安装启动报错解决方法
    【ElasticSearch】使用 Java 客户端 RestClient 实现对文档的查询操作,以及对搜索结果的排序、分页、高亮处理
    一文带你了解人工智能:现状、应用、变革及未来展望
  • 原文地址:https://blog.csdn.net/yyqzjw/article/details/133943847