atoi函数的认识与模拟

atoi函数的认识

atoi的头文件

<math.h> 或者 <stdlib.h>

返回值和参数

首先atoi函数的头文件是
这里函数的返回值是 int 类型的,函数的参数是 字符指针。

atoi的具体解释

  1. atoi(s)函数用于把字符串转换成整数,转换后的值不能超出int的表示范围。

  2. 这个函数会尽可能多的在开头丢弃空格字符,直到遇到第一个非空格的字符,从这个字符开始,如果这个字符是正号或者负号,直接取出这个字符,后面尽可能多的跟随十进制数字,而一旦遇到非整数的字符,直接返回这个字符之前的整数,后面的字符全部放弃,不会对函数造成影响。

  3. 如果遇到的第一个非空格字符不是一个有效的整数字符,参数指针为空或者仅包含空格字符,这些情况下,不执行转换直接返回0;

在这里插入图片描述代码演示效果在这里插入图片描述

atoi函数的模拟

atoi函数模拟前的问题总结

  1. 函数传入空指针------------------程序错误

  2. 函数传入空字符串------------------返回0
    在这里插入图片描述

  3. 传入了一个非数字字符--------------------返回0
    在这里插入图片描述

  4. 开头有空白符号----------------直接跳过,直到遇到第一个非空白的字符

  5. 正负号问题-------------------只有第一个非空白的字符为正负号时,才会取这个字符,如果第一个非空白的字符不是正负号,后面遇到的正负号,一律打成非整数字符的其他字符。

  6. 返回值是整型,所以返回时可能出现的数据溢出问题。----------------如果返回值超出了int类型的最大值,就会造成越界,这时返回 INT_MAX。同时要注意,函数的返回值如果用int储存,那么当返回值超出int类型的最大值时,就会发生截断,就不会显示异常了。

atoi函数模拟代码

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

int my_atoi(const char* str)
{
	//防止传入的是空指针,用assert断言一下。
	assert(str);
	//如果传入的是空字符串或者仅有空格的字符串,不进行转换,直接返回0
	//这里用while找出第一个非空格的字符	
	while (*str == ' ')
	{
		str++;
	}

	//判断第一个非空格的字符是否为  \0   ,\0是字符串的结束标志,如果是'\0',直接返回0。
	if (*str == '\0')
	{
		return 0;
	}

	//判断第一个非空格字符是否为正负号
	int Fuhao = 1;
	if (*str == '-')
	{
		Fuhao = -1;
		str++;
	}
	else if (*str == '+')
	{
		str++;
	}

	//判断后面的字符是否为整数字符
	long long int num = 0;
	while ((*str - 48) >= 0 && (*str - 48) <= 9)
	{
		num = num * 10 + (*str - 48);
		str++;
	}
	num = num * Fuhao;
	// 判断返回值是否溢出
	if (num < INT_MIN)
	{
		return INT_MIN;
	}
	else if (num > INT_MAX)
	{
		return INT_MAX;
	}
	else
	{
		return (int)num;
	}
}


int main()
{
	//test
	char a1[] = "";
	char a2[] = "1111111111111111111111111111111111111111";
	char a3[] = "13215das13";
	char a4[] = "1358dasd5";
	char a5[] = "asd23153";

	printf("%d\n", my_atoi(a1));
	printf("%d\n", my_atoi(a2));
	printf("%d\n", my_atoi(a3));
	printf("%d\n", my_atoi(a4));
	printf("%d\n", my_atoi(a5));
	return 0;
}

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值