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

news/2024/12/21 20:45:16/

        这篇文章是关于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;而不是基于记录的物理位置。这意味着它们通常与某种…