C语言-atoi函数的模拟

本文详细介绍了如何在C语言中实现模拟atoi函数,包括处理空格、正负号、非数字字符,以及确保转换结果在整数范围内的逻辑。作者通过代码示例展示了整个过程,强调了类型取值和内存存储对函数执行的影响。

 

模拟术语讲解

  1. 首先,需要定义一个标志位变量sign,用于表示转换结果的合法性1。
  2. 定义一个函数My_atoi,用于实现atoi的功能1。
  3. 在My_atoi函数中,首先遍历字符串,直到遇到第一个非空格字符1。
  4. 如果第一个字符不是数字或正负号,直接返回01。
  5. 如果第一个字符是负号,则判断是否为负数,如果是,将符号位flag设置为-1,并移动到下一个字符1。
  6. 如果符号位后面紧跟数字,进行数字转换1。
  7. 将转换后的数字乘以符号位1。
  8. 检查转换后的数字是否在INT_MIN和INT_MAX之间1。
  9. 在主函数中,定义一个字符数组arr,存储待转换的字符串1。
  10. 调用My_atoi函数进行转换1。
  11. 根据转换结果的符号位,判断转换是否合法1

—————————————————————————————————————————————————————————————————————————————————————— 

 图解说明

这里也就是正负数会打印出来

也就是

1加减会影响数字的正负

2 再这个字符串里面 如果出现非数字字符 也就是会停止转化

3,只会过滤开始的 空格 中间遇见任何不是数值的东西 都会直接结束循环

4 如果转换之后的数字大于最大值那么按照最大值算,如果比最小值还小 那么按照最小值计算

进行参数的判断

作用 判断传进来的是不是空格

头文件

判断是不是空格

因为这里的逻辑是 刚开始的时候 从空格外进行计算

这里判断是不是空格的函数 空格就进行++

判断正负数

细致进行判断

假设是

123a

只要遇见的不是‘\0’就继续进行循环

内部进行计算

这个是isdigit进行函数判断 也就是 判断是不是数字字符

是就返回不是0

flg是正负数

else

强制类型转化

完善

if大于最大值 小于最小值

这里给一个限制 超出就返回最大或者最小值

这里进行解释 是因为返回的是一个整数

也就是 返回的是一个整体 不是一个一个

如果是123的时候

此时也就是

0*10+1=1

1*10+2=12

12*10+3=123

所以返回的是一个整体的数字 而不是分开的

枚举的使用

利用枚举进行判断是不是合法转化

这里可以使用枚举 进行一个判断

也就是

—————————————————————————————————————————————————————————————————————————————————————— 

知识点补充 

 对于类型取值学习不理解的,可以看看这一篇文章。类型在内存中的存储范围-优快云博客icon-default.png?t=N7T8https://blog.youkuaiyun.com/Jason_from_China/article/details/137104093

—————————————————————————————————————————————————————————————————————————————————————— 

 代码详解

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
#include<limits.h>//INT_MAX的头文件
#include<ctype.h>//isspace判断是不是空格 只要是就继续循环
//atio的逻辑是把字符串转化成数字
//1,开始在遇见第一个数字字符之间只要是空格会一直继续往后计算
//2,在遇见第一个数字字符之后,只要不是数字字符会直接返回
// 
//也就是
//1加减会影响数字的正负
//2 再这个字符串里面 如果出现非数字字符 也就是会停止转化
//3,只会过滤开始的 空格 中间遇见任何不是数值的东西 都会直接结束循环
//4 如果转换之后的数字大于最大值那么按照最大值算,如果比最小值还小 那么按照最小值计算
//
int MY_atoi(const char* str)
{

	//进行一个断言防止空字符
	assert(str != NULL);
	//进行一个长度返回
	if (*str == '\0')
	{
		return 0;
	}
	//循环排除空格     "     123s4 5 w"
	while (isspace(*str))//这里解应用元素++
	{
		str++;
	}
	//这里进行判断正负号 。不显示的话默认也就是+"     123s4 5 w"
	int flg = 1;
	if (*str == '+')
	{
		flg = 1;
		str++;
	}
	else if (*str == '-')
	{
		flg = -1;
		str++;
	}
	

	//遇见数字字符,但是这里是一直循环之前是不遇见最后一个字符串0的 那就是循环没有结束
	long long ret = 0;// 这里采取一个比较大的类型进行接收,因为实际操作的时候可能数值会很大
	while (*str != '\0') 
	{
		if (isdigit(*str))//此时到这里就已经是"123s4 5 w",这里是判断当前是字符是不是空字符 不是就继续运行
		{
			ret = ret * 10 + (*str - '0') * flg;
			//补充知识说明 因为整数在计算的时候是有一个区间范围的 整数的区间 我们在csdn引入的博客里面进行了讲解
			if (ret > INT_MAX)
			{
				ret = INT_MAX;
			}
			if (ret < INT_MIN)
			{
				ret = INT_MIN;
			}
		}
		else
		{
			//这里一旦遇见不是数字字符的情况,就会返回,因为这里是把++放到了最后,所以每次计算的时候已经
			//把字符转化成一个整数了,也就是返回的时候返回的是一个数值,再进行强制转化
			//因为我们给的是long long类型的(防止数值过大无法接收)
			return (int)ret;
		}
		str++;//这里吧++ 放到最后 把计算放到if里面 并且这里是地址++ 不是元素++ 所以不需要解应用
	}
	//

	//
	return (int)ret;
}
int main()
{
	char arr[] = "     123s45 w";
	int ret = MY_atoi(arr);
	printf("%d ", ret);
	return 0;
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值