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

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

枚举的使用

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

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

也就是

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

知识点补充 

 对于类型取值学习不理解的,可以看看这一篇文章。类型在内存中的存储范围-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/508949.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

通讯录改造———文件版本

上一篇文章我们详细讲了文件操作&#xff0c;这时候我们就可以把通讯录保存到文件中&#xff0c;这样即使程序退出了&#xff0c;联系人的信息也还是保存着&#xff0c;下一次启动程序时我们就可以把文件中的数据读取到程序中来使用。 保存 首先我们要在退出通讯录之前把联系人…

Spring Boot 介绍

1、SpringBoot 介绍 用通俗的话讲&#xff0c;SpringBoot 在Spring生态基础上发展而来&#xff0c;它的发现不是取代Spring&#xff0c;是为了让人们更容易使用Spring。 2、相关依赖关系 Spring IOC/AOP > Spring > Spring Boot > Spring Cloud 3、 SpringBoot工作原…

R语言,数据类型转换

原文链接&#xff1a;R语言技能 | 不同数据类型的转换 本期教程 写在前面 今天是4月份的第一天&#xff0c;再过2天后再一次迎来清明小假期。木鸡大家是否正常放假呢&#xff1f; 我们在使用R语言做数据分析时&#xff0c;会一直对数据进行不同类型的转换&#xff0c;有时候…

IP地址与子网掩码

1 IP地址 1.1 IPv4与IPv6 1.2 IPv4地址详解 IPv4地址分4段&#xff0c;每段8位&#xff0c;共32位二进制数组成。 1.2.1 地址分类 这32位又被分为网络号和主机号两部分&#xff0c;根据网络号占用位数的不同&#xff0c;又可分为以下几类&#xff1a; A类地址&#xff1a;…

Higress 基于自定义插件访问 Redis

作者&#xff1a;钰诚 简介 基于 wasm 机制&#xff0c;Higress 提供了优秀的可扩展性&#xff0c;用户可以基于 Go/C/Rust 编写 wasm 插件&#xff0c;自定义请求处理逻辑&#xff0c;满足用户的个性化需求&#xff0c;目前插件已经支持 redis 调用&#xff0c;使得用户能够…

Windows提权—数据库提权-mysql提权mssql提权Oracle数据库提权

目录 Windows 提权—数据库提权一、mysql提权1.1 udf提权1.1.2 操作方法一 、MSF自动化--UDF提权--漏洞利用1.1.3 操作方法二、 手工导出sqlmap中的dll1.1.4 操作方法三、 moon.php大马利用 1.2 mof提权1.3 启动项提权1.4 反弹shell 二、MSSQL提权MSSQL提权方法1.使用xp_cmdshe…

Ps:阈值

阈值 Threshold命令可将灰度图像或彩色图像转换为仅包含黑色和白色的二值图像。 Ps菜单&#xff1a;图像/调整/阈值 Adjustments/Threshold Ps菜单&#xff1a;图层/新建调整图层/阈值 New Adjustment Layer/Threshold 阈值命令通过设置一个特定的亮度阈值&#xff08;阈值色阶…

深度解析:Elasticsearch检索请求原理

在上一篇文章中&#xff0c;我们学习了 Elasticsearch 的写入流程&#xff0c;今天我们来学习一下 Elasticsearch 的读取流程&#xff0c;当一个检索请求到达 Elasticsearch 之后是如何进行检索的呢&#xff1f; 下面先说一下一个总的检索流程。 1、客户端发送请求到任意一个…

企业能耗数据分析有哪些优势?怎样进行分析?

随着互联网技术的发展&#xff0c;企业在运营中会出现大量的用能数据&#xff0c;但却做不了精准的用能数据分析&#xff0c;导致数据没有得到有效利用&#xff0c;以及产生能源浪费现象。 为什么企业用能分析总是难&#xff1f; 一、用能分析过程复杂 由于用能分析过于复杂…

正则表达式引擎库汇合

1.总览表格 一些正则表达式库的对比 index库名编程语言说明代码示例编译指令1Posix正则C语言是C标准库中用于编译POSIX风格的正则表达式库 posix-re.cgcc posix-re.c 2PCRE库C语言提供类似Perl语言的一个正则表达式引擎库。 一般系统上对应/usr/lib64/libpcre.so这个库文件&am…

读所罗门的密码笔记07_共生思想(中)

1. 在人工智能系统中建立信任 1.1. 人类的大脑容易被个人倾向、干扰因素和确认偏误所影响 1.2. 古莱说&#xff0c;然而&#xff0c;从不同的角度去思考事实、花更长时间来做决策的能力&#xff0c;可能会让人类拥有“密探”一般的智慧 1.3. 我们可以对决策进行批判性思考&a…

c语言----自定义类型---结构体(声明、重命名、对齐规则、传参、位段...详解)

目录 一、结构体类型的声明二、结构体的特殊声明三、结构体的重命名四、结构体的自引用五、结构体的内存对齐5.1对齐规则5.1.1练习 5.2为什么存在内存对齐?5.3 修改默认对齐数 六、结构体传参七、结构体实现位段7.1什么是位段7.2 位段的内存分配7.3 位段的跨平台问题7.4 位段的…

谷粒商城——通过接口幂等性防止重复提交订单

如果用户向后端服务提交多次相同订单的提交服务&#xff0c;那么后端应该只生成一条订单记录。 有一些操作天然是幂等的&#xff0c;如查询操作和删除操作等。 幂等性实现 1.token机制&#xff08;仅这个方法适用于订单的重复提交&#xff09; 后端先生成1个令牌将其记录在R…

智能停车场物联网远程监控解决方案

智能停车场物联网远程监控解决方案 智能停车场物联网远程监控解决方案是一种集成了现代物联网技术、大数据分析以及云计算等先进技术手段&#xff0c;对停车场进行全面智能化管理的综合系统。它通过实时感知、精准采集和高效传输各类停车数据&#xff0c;实现对停车场运营状态…

机器学习(四)

贝叶斯分类器与贝叶斯学习: 贝叶斯分类器:只要是一种生成式模型&#xff0c;并且使用到了贝叶斯公式 贝叶斯学习:一定在使用分布估计 贝叶斯分类器并不等于贝叶斯学习 极大似然估计: 先假设某种概率分布形式&#xff0c;再基于训练样例对参数进行估计 集成学习: 如何得到…

C#学习笔记 面试提要

冒泡 for (int m 0; m < arr.Length; m) { for (int n 0; n < arr.Length - 1 - m; n) { if (arr[n] > arr[n1]) { int temp arr[n]; arr[n] arr[n 1]; arr[n1] temp; } } } 选择 for (int m 0; m < arr.Length; m) { int index 0; for (int n 1; n < …

亿图图示如何绘制WBS分解?

什么是WBS分解&#xff1f; Wbs分解俗称工作分解结构法&#xff0c;就是把一个大项目按照原则分成多个小任务&#xff0c;再把每项小任务分解成具体的工作&#xff0c;然后把工作分到每人的工作中的一种分解方法。 如下图这里以开店KTV为例&#xff0c;项目是开店&#xff0c;小…

Unity UGUI之Text组件基础认识

Text组件用于在游戏中显示文本。 下面来细看下它的基本信息。 一、基本属性&#xff1a; 如上图所示&#xff0c;即为Text组件的一些基本属性&#xff0c;其中&#xff0c; Text&#xff1a;要显示的文本内容。Font&#xff1a;文本所使用的字体。Font Style&#xff08;字体…

基于PSO优化的CNN-LSTM-Attention的时间序列回归预测matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1卷积神经网络&#xff08;CNN&#xff09;在时间序列中的应用 4.2 长短时记忆网络&#xff08;LSTM&#xff09;处理序列依赖关系 4.3 注意力机制&#xff08;Attention&#xff09; 5…

05 | Swoole 源码分析之 WebSocket 模块

首发原文链接&#xff1a;Swoole 源码分析之 WebSocket 模块 大家好&#xff0c;我是码农先森。 引言 WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。它允许客户端和服务器之间进行实时数据传输。 与传统的 HTTP 请求-响应模型不同&#xff0c;WebSocket 可以保持…