C语言-atoi函数的模拟

news2025/2/22 8:51:08

 

模拟术语讲解

  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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ROS安装教程(鱼香ROS快捷版)

文章目录 前言一、ROS版本二、ROS安装1.添加ROS源2.添加密钥3.安装ROS4.安装python依赖包&#xff08;可选&#xff09;5.初始化rosdep6.ROS 测试 总结 前言 对于初学者来说&#xff0c;ROS的安装往往是一个令人头疼的问题&#xff0c;复杂的步骤和网络问题常常成为入门的第一…

kubernetes-dashboard 安装配置

k8s 1.23以上的版本 https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml 执行命令&#xff1a; kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml 安装完成后&#x…

FSH6罗德与施瓦茨FSH6频谱分析仪

181/2461/8938产品概述&#xff1a; R&S FSH6频谱分析仪坚固耐用、方便易用&#xff0c;专为野外使用而设计。它重量轻、操作简单、设计合理且具有大量测量功能&#xff0c;是任何需要高效测量仪器进行户外工作的人不可或缺的工具。 R&S FSH6是一款手持式频谱分析仪&…

项目:USB键盘和鼠标的复合设备

我们的复合设备使用一个物理设备就可以完成多个功能。 使用复合设备同时完成USB键盘和鼠标功能&#xff0c;它的主要实现方式有两种&#xff0c; 第一个就是我们将多个设备描述符合并成一个&#xff0c;这个相对比较简单&#xff0c;我们只要根据相应的报告描述符处理数据就可…

基于springboot实现在线文档管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现在线文档管理系统演示 摘要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;在线文档管理当然也不能排除在外。在线文档管理系统是以实际运用为开发背景&am…

3分钟教你最大化利用APP消息推送(Push)在运营中的优势

推送通知是指运营团队通过自有产品或外部工具&#xff0c;主动向用户的移动设备发送信息。用户可以直接在手机的锁屏和通知中心看到这些推送通知&#xff0c;点击通知中心的相关内容可以激活应用并跳转至特定页面。例如&#xff0c;我们在手机锁屏时接收到的微信消息&#xff0…

SSM框架学习——MyBatis关联映射

MyBatis关联映射 为什么要关联映射 实际开发中&#xff0c;对数据库操作常常会涉及多张表&#xff0c;所以在OOP中就涉及对象与对象的关联关系。针对多表操作&#xff0c;MyBatis提供关联映射。 关联关系概述 一对一&#xff1a;A类中定义B类的属性b&#xff0c;B类中定义A…

电脑常见故障检测方法与对应问题分析说明

电脑常见故障检测方法与对应问题分析说明 前言说明1、机器无法开机故障2、屏幕无法显示3、无法联网4、能开机但是无法进入系统&#xff0c;提示not boot5、USB接口无法识别U盘 前言说明 本文为小白向&#xff0c;许多内容属于经验学而非科学&#xff0c;还望大佬们轻喷。 如上…

Verilog语法之always语句学习

always语法是Verilog_HDL中最常用的一种语法。 always过程语句和语句块组成的&#xff0c;语法格式如下所示。 always(敏感信号1 or 敏感信号2.....) always实现组合逻辑和时序逻辑。用always实现组合逻辑要将所有的敏感信号加入敏感列表中&#xff1b;用always实现时序逻辑时…

为什么都说”一入Java深似海“?

引言 在当今数字化时代&#xff0c;编程已经成为一项至关重要的技能。而在众多编程语言中&#xff0c;Java以其广泛的应用领域和强大的功能特性&#xff0c;吸引了无数开发者的目光。无论是Web开发、移动应用还是大数据处理&#xff0c;Java都发挥着举足轻重的作用。然而&…

GDAL源码剖析(一)

GDAL源码剖析&#xff08;一&#xff09;_gdal 源码-CSDN博客 一、GDAL简介 GDAL官方网站http://www.gdal.org/&#xff0c;本文章中的基本内容都是参照官网中的信息&#xff0c;如有错误或者与官网中的内容冲突&#xff0c;以官网中的为正确。 在开始文章之前&#xff0c;我…

探索数字物流技术 2024中国国际展览会与您相约七月杭州

数字贸易创新引领合作动能 《十四五规划》明确指出关于“加快数字化发展&#xff0c;建设数字中国”要求&#xff0c;积极为全国数字物流链转型革新试水探路。全力发展以数字化为引领的现代产业体系,打造面向未来、全球的数字物流技术变革高地。数字化成为了物流和供应链企业推…

Redis实战(黑马点评:短信登录)

1.基于Session实现发送短信验证码 UserController: /*** 发送手机验证码*/PostMapping("code")public Result sendCode(RequestParam("phone") String phone, HttpSession session) {return userService.sedCode(phone,session);}UserServiceImpl: Overri…

[yolox]ubuntu上部署yolox的ncnn模型

首先转换pytorch->onnx->param模型&#xff0c;这个过程可以查资料步骤有点多&#xff0c;参考blog.51cto.com/u_15660370/6408303&#xff0c;这里重点讲解转换后部署。 测试环境&#xff1a; ubuntu18.04 opencv3.4.4(编译过程省略&#xff0c;参考我其他博客) 安装…

一个页面实现两个滚动条【前端】

一个页面实现两个滚动条【前端】 前言版权推荐一个页面实现两个滚动条最后 前言 2024-4-2 12:54:46 以下内容源自《【前端】》 仅供学习交流使用 版权 禁止其他平台发布时删除以下此话 本文首次发布于CSDN平台 作者是CSDN日星月云 博客主页是https://jsss-1.blog.csdn.net …

25.死锁

一个线程如果需要同时获取多把锁&#xff0c;就容易产生死锁。 t1线程获得A对象锁&#xff0c;接下来想获取B对象的锁。 t2线程获得B对象锁&#xff0c;接下来想获取A对象的锁。 /*** 死锁demo* param args*/public static void main(String[] args) {Object a new Object(…

数字医疗:智慧医共体引领健康未来

随着科技的不断发展&#xff0c;数字医疗正在成为医疗行业的一场革命。数字化技术的应用不仅提高了医疗服务的效率和质量&#xff0c;还为人们带来了更便捷、智能的健康管理方式。在这个数字化时代&#xff0c;智慧医共体已经成为了健康未来的引领者。 数字医疗&#xff0c;顾…

超图新建三维数据集继续学习

1 新建三维数据集 之前操作过新建三维数据集&#xff0c;还不熟悉&#xff0c;继续熟悉&#xff1b; 现在有一个文件型的数据源&#xff0c;名为swtest1&#xff1b;它前面小图标上有UDX三个字母&#xff0c;表明这是一个UDX类型的数据源&#xff1b;在此数据源上右击&#x…

研发效能·创享大会—IDCF五周年专场

时光流转&#xff0c;IDCF即将迎来五周年的庆典。在这个意义非凡的时刻&#xff0c;我们精心筹备了一场盛大的聚会【研发效能创享大会—IDCF五周年专场】。 IDCF自2019年成立以来&#xff0c;携手百余位技术领头人共同打造DevOps技术学习平台&#xff0c;与30万社群伙伴联动&a…

如何改写出优质文案,AI写作工具有方法

在当今数字化时代&#xff0c;内容创作已成为企业和个人在市场竞争中脱颖而出的关键因素。而写作优质文案是吸引读者注意力、传达信息以及促使行动的重要手段之一。然而&#xff0c;对许多人来说&#xff0c;写作可能是一项具有挑战性的任务。幸运的是&#xff0c;随着人工智能…