关于atoi函数的使用和模拟实现

news/2024/9/15 21:03:49/

        这篇文章是关于atoi函数是怎样使用的和我们如何模拟实现它的。话不多说,我们先从C++网站上关于atoi的函数信息入手。

函数分析

        首先我们可以看到它的返回值是int形参是一个字符串的首字母地址,它可以省略从字符串开始知道遇见的第一个非空白字符,如果不是加号或者减号或者字符数字,就直接返回0;如果除开非空格字符的第一个字符是加号或者减号,将加号或者减号保留,将后面的字符数字变为整形数字,然后知道遇到的不是字符数字为止,返回该数字,如果该数字大于int的最大值INT_MAX,则赋值为最大值,相反,小于了int的最小值就将它变为最小值输出。我们先写几个代码观察一下。

        可以看到,输出的结果,和我们上面讲解的基本相同。

        我们再用VS观察一下int的最大和最小值。

了解了上面这些东西之后,我们就可以动手自己写一个属于自己的atoi函数,我们先暂时把它命名为my_atoi吧。

模拟实现

首先我们肯定是要和它具有相同的形参。

int my_atoi(const char* arr)

我们第一步要做的就是从第一个元素开始判断是否是空格。我们可以用到isspace这个函数。

保存在<ctype.h>头文件里。

它可以用来检查字符是否是空白字符。我们可以像下面这样写。

	while (isspace(*arr)){	arr++;}

从第一个字符开始,如果是字符,isspace函数返回为真,就进入循环,地址加1,到下一个字符,知道不是空白字符。

到了第二步,我们该判断是否是加号或者减号了,我们可以写一个判断语句如下。

	int flag=1;if (*arr == '-'){flag = -1;arr++;}elseif (*arr == '+'){arr++;}

我们再前面定义了flag=1,默认它是正数,如果满足判断语句,就进去修改flag的值,并且arr加1,让指针值到下一个字符。

下面终于轮到判断是否是数字字符了。这时我们还可以用到一个函数是isdigit,保存在<ctype.h>头文件里。

它的作用是判断字符是否是十进制的数字字符,如果是返回非零,否则返回零。

这个时候我们需要定义一个变量来储存我们的返回值了,我们定义了一个sum来接受,如果从我们正式开始判断的第一个字符就不是数字字符,就返回零。所以说我们使用了一个while循环来判断。

	while (isdigit(*arr)){    long long sum=0;sum =sum*10+ flag * (*arr - '0');arr++;}

如果是数字字符,我们就将它减去字符零,就得到了整形的数字,然后将它和flag相乘,flag代表我们的正负,赋给sum,依次类推。(注意:这里的sum定义为long long 是为了防止得到的值非常的大)。 

最后我们需要判断一下我们得到的sum是否大于INT_MAX,如果大于就返回最大值,相反,就返回最小值,如果都不满足就返回sum。代码如下。

	if (sum > INT_MAX)return INT_MAX;if (sum < INT_MIN)return INT_MIN;return sum;

我们还可以声明一个枚举变量states来表示是否是合法转换,就是是否走到了字符串的尽头'\0'。如果是,就是合法转换,如果不是,就是非法转换,让代码更加完美。

enum state {VALUE,UNVALUE
};

完整代码


enum state {VALUE,UNVALUE
};int my_atoi(const char* arr)								//模拟实现atoi函数
{//1.atoi函数的作用就是将字符串数字转化为整形数字.//2.+-会影响这个数字的正负。//3.在这个字符串中,如果过出现了非数字字符,那就结束转换//4.如果转换后的数字大于int的最大或最小值,就按最大或者最小值计算。enum state states= UNVALUE;assert(arr);int flag = 1;long long sum=0;while (isspace(*arr)){	arr++;}if (*arr == '-'){flag = -1;arr++;}elseif (*arr == '+'){arr++;}while (isdigit(*arr)){sum =sum*10+ flag * (*arr - '0');arr++;}if (*arr == '\0')states = VALUE;if (sum > INT_MAX)return INT_MAX;if (sum < INT_MIN)return INT_MIN;return sum;}

下面我们来用我们自己做的atoi函数来实现和库函数的atoi函数是否相同。

可以对比和前面的结果相同。

总结

         好了,本节关于atoi函数的使用和模拟实现就讲到这,希望上面讲到的内容对大家有所帮助,如果有讲的不对的地方,还请大家指正,希望大家可以点赞,关注加收藏,谢谢大家。


http://www.ppmy.cn/news/1404991.html

相关文章

关于 QSound播放wav音频文件,播放失败“using null output device, none available” 的解决方法

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/137264493 红胖子(红模仿)的博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软…

【Node.js从基础到高级运用】二十一、使用child_process模块创建子进程

引言 在Node.js中&#xff0c;child_process模块是一个提供了创建和管理子进程的能力的核心模块。通过使用child_process模块&#xff0c;Node.js可以执行系统命令、运行其他脚本或应用程序&#xff0c;实现与Node.js进程的并行处理。 child_process模块提供了几种创建子进程的…

dotnet依赖注入与IOC

依赖注入与IOC IOC IOC 是 Inversion of Control&#xff08;控制反转&#xff09;的缩写。在软件开发中&#xff0c;IOC 是一种设计模式&#xff0c;它改变了传统的程序设计流程&#xff0c;使得对象之间的依赖关系由代码本身控制变为由外部容器控制。 而采用IOC 设计模式后&…

iOS开发进阶(十三):脚手架创建iOS项目

文章目录 一、前言二、xcode-select 命令三、拓展阅读 一、前言 项目初期&#xff0c;需要搭建项目基本框架&#xff0c;为此离不开辅助工具&#xff0c;即脚手架。当然&#xff0c;IDE也可以实现新建空白项目&#xff0c;但是其新建后的项目结构可能不符合预期设计&#xff0…

基于深度学习的危险物品检测系统(网页版+YOLOv8/v7/v6/v5代码+训练数据集)

摘要&#xff1a;本文详细介绍基于YOLOv8/v7/v6/v5的危险物品检测技术。主要采用YOLOv8技术并整合了YOLOv7、YOLOv6、YOLOv5的算法&#xff0c;进行了细致的性能指标对比分析。博客详细介绍了国内外在危险物品检测方面的研究现状、数据集处理方法、算法原理、模型构建与训练代码…

STM32重要参考资料

stm32f103c8t6 一、引脚定义图 二、时钟树 三、系统结构图 四、启动配置 &#xff08;有时候不小心短接VCC和GND&#xff0c;芯片会锁住&#xff0c;可以BOOT0拉高试试&#xff08;用跳线帽接&#xff09;&#xff09; 五、最小系统原理图 可用于PCB设计

宝塔面板提示当前未安装docker或docker-compose有效解决方案!

宝塔面板提示当前未安装docker或docker-compose有效解决方案&#xff01; 首先点面板的安装docker后依旧提示【当前未安装docker或docker-compose,点击安装】&#xff0c;解决方法就是输入两条命令后刷新即可&#xff0c;命令ln -s /usr/local/bin/docker-compose /usr/bin/doc…

【mysql 第3-10条记录怎么查】

mysql 第3-10条记录怎么查 在MySQL中&#xff0c;如果你想要查询第3到第10条记录&#xff0c;你通常会使用LIMIT和OFFSET子句。但是&#xff0c;需要注意的是&#xff0c;LIMIT和OFFSET是基于结果集的行数来工作的&#xff0c;而不是基于记录的物理位置。这意味着它们通常与某种…

深度学习500问——Chapter05: 卷积神经网络(CNN)(2)

文章目录 5.6 有哪些池化方法 5.7 1x1卷积作用 5.8 卷积层和池化层有什么区别 5.9 卷积核是否一定越大越好 5.10 每层卷积是否只能用一种尺寸的卷积核 5.11 怎样才能减少卷积层参数量 5.12 在进行卷积操作时&#xff0c;必须同时考虑通道和区域吗 5.13 采用宽卷积的好处有什么 …

某音乐平台歌曲信息逆向之参数寻找

如何逆向加密参数&#xff1a;某音乐平台歌曲信息逆向之webpack扣取-CSDN博客 参数构建 {"comm": {"cv": 4747474,"ct": 24,"format": "json","inCharset": "utf-8","outCharset": "ut…

续-开发组件更新-提效工具分享

前言 小一个月没更新了&#xff0c;有各种各样的事啦&#xff0c;这一篇有点水吧。围绕两方面&#xff0c;开发组件更新以及IDEA插件的分享&#xff0c;题目和我一样水&#xff0c;有点像是日本轻小说取名了&#xff0c;整这么长。本篇的触动来源于&#xff0c;我今天偶然发现…

#设计模式#3.1用做松鼠桂鱼来理解抽象工厂(对象创建型模式)

概念&#xff1a;xx工厂&#xff0c;xx产品 区分 工厂是动作&#xff0c;产品是结果&#xff08;菜品&#xff09; 概念&#xff1a;抽象xx&#xff0c;具体xx 区分 抽象产品&#xff1a;“中式菜品” 具体产品&#xff1a;“麻婆豆腐”、“宫保鸡丁” 抽象工厂&#xff1a;“…

AWS相关服务说明

互联网网关 官网 # 官网 https://docs.aws.amazon.com/zh_cn/vpc/latest/userguide/VPC_Internet_Gateway.htmlInternet 网关是一种横向扩展、冗余且高度可用的 VPC 组件&#xff0c;支持在 VPC 和 Internet 之间进行通信。它支持 IPv4 和 IPv6 流量。它不会对您的网络流量造…

[Linux]基础IO(中)---理解重定向与系统调用dup2的使用、缓冲区的意义

重定向理解 在Linux下&#xff0c;当打开一个文件时&#xff0c;进程会遍历文件描述符表&#xff0c;找到当前没有被使用的 最小的一个下标&#xff0c;作为新的文件描述符。 代码验证&#xff1a; ①&#xff1a;先关闭下标为0的文件&#xff0c;在打开一个文件&#xff0c;…

合并两个单链表

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 但行前路&#xff0c;不负韶华&#…

探析Drools规则引擎的工作机制

目录 一、工作原理 二、工作流程 2.1 初始化环境 2.2 添加规则文件 2.3 编译规则文件 2.4 插入到工作内存 2.5 规则匹配与激活 2.6 规则执行 三、Drools 其他特性 3.1 符合事实 3.2 决策表 3.3 规则生命周期管理 3.4 规则流 四、Rete 算法 一、工作原理 Drools 规则引擎的工…

谷歌(Google)技术面试——在线评估问题(一)

谷歌&#xff08;Google&#xff09;面试过程的第一步&#xff0c;你可能会收到一个在线评估链接。 评估有效期为 7 天&#xff0c;包含两个编码问题&#xff0c;需要在一小时内完成。 以下是一些供你练习的在线评估问题。 在本章结尾处&#xff0c;还提供了有关 Google 面试不…

最新AI工具系统ChatGPT网站运营源码SparkAi系统V6.0版本,GPTs应用、AI绘画、AI换脸、垫图混图、Suno-v3-AI音乐生成大模型全支持

一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧。已支持GPT…

酷开科技智慧AI让酷开系统大显身手!

时代的浪潮汹涌而至&#xff0c;人工智能作为技术革新和产业变革的重要引擎&#xff0c;正深刻地影响着各行各业。在科技的海洋中&#xff0c;AI技术正逐渐渗透到我们的日常生活中&#xff0c;为我们带来前所未有的便捷和智慧。酷开科技用技术探索智慧AI&#xff0c;别看它只是…

微服务(基础篇-007-RabbitMQ部署指南)

目录 05-RabbitMQ快速入门--介绍和安装_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1LQ4y127n4?p65&vd_source60a35a11f813c6dff0b76089e5e138cc 1.单机部署 1.1.下载镜像 1.2.安装MQ 2.集群部署 2.1.集群分类 2.2.设置网络 视频地址&#xff1a; 05-Rab…