解题 - 模拟实现 atoi

news2024/9/20 9:42:31

文章目录

前言

一、atoi 函数是什么?

二、模拟实现 atoi 

总结


前言

路漫漫其修远兮,吾将上下而求索;


一、atoi 函数是什么?

  • atoi
  • int atoi(const char* str);
  • 所要引用的头文件: <stdlib.h>
  • 原理:将字符串转换为整数;解析c字符串str,将其内容解释为整数,并返回int类型的值。函数atoi 如果遇到空白字符便会跳过空白字符(利用库函数 isspace), 直到遇到第一个非空白字符才会正式开始,从此字符开始,可以识别+ 或者 - ;在此之后,如果是数字字符,便会将数字字符转换成数字,如果遇到的是非数字字符那么便会直接返回; 
  • 返回值:其返回类型为 int ;如果成功,该函数将转换后的整数作为整型值返回。如果转换后的值超出了int可表示值的范围,则会导致未定义的行为。

经过以上的讲述,我们可以提炼的atoi 函数的要求:

1、在字符串中如果首先遇到的是空白字符串,便会跳过这些空白字符串(可以利用库函数 isspace 进行操作)

2、可以识别 + 或者 - , 即atoi 返回的整型可以带上符号;

3、遇到数字字符便会将数字字符转换成数字;如果遇到非数字字符便会直接返回

4、函数atoi 返回的值可能会存在超出int 所表示的数据的范围;

二、模拟实现 atoi 

代码如下:

#include<stdio.h>
#include<assert.h>
#include<ctype.h>
#include<limits.h>

enum Static
{
	INVALID,
	VALID
}sta = INVALID;//默认为非法

int my_atoi(const char* str)
{
	assert(str);//细节避空
	int flag = 1;//默认没有符号变为正值
	//如果传空字符串呢?
	if (*str == '\0')
	{
		return 0;//返回非法0
	}
	//跳过空白字符
	while (isspace(*str))//当*str 不为空白字符的时候, isspace(*str) 的返回值为0
	{
		str++;
	}
	//接收正负号
	if (*str == '-')
	{
		flag = -1;
		str++;
	}
	else if(*str == '+')
	{
		flag = 1;
		str++;
	}
	//else 便就是没有+ 或者 - ,于是乎默认为正值

	//后面的字符,如果是数字字符,便将数字字符转换成数字;如果遇到数字字符便直接返回
	long long ret = 0;//考虑到会超出int 类型的取值范围,于是将ret 的类型改为long long
	while (*str)
	{
		if (*str >= '0' && *str <= '9')//数字字符
		{
			ret = ret * 10 + flag *(*str - '0');//将正负号也考虑进去
			//判断是否超过int 类型的取值返回,超过便返回0,因为此时返回多少均无意义
			if (ret >= INT_MAX || ret <= INT_MIN)
			{
				return 0;
			}
			str++;//调整
		}
		else//非数字字符直接返回
		{
			return (int)ret;
		}
	}
	//来到此处便说明为合法
	if (*str == '\0')
	{
		sta = VALID;
	}
	return (int)ret;

}

int main()
{
	//模拟实现atoi
	//int atoi(conat char* str);

	char ch[20] = "   -112233";
	int ret = my_atoi(ch);
	if (sta)
		printf("合法返回:%d\n", ret);
	else
		printf("非法返回: %d\n", ret);
	

	return 0;
}

代码运行结果如下:

注:

为什么要创建一个枚举变量sta ?

  • 因为在atoi 函数中,遇到空字符会返回0,便会与是不是因为该字符含有数字字符0而混淆;于是乎便利用枚举设置了两种状态:非法 与 合法 来加以区分;当传过来的字符串为空字符串的之后,便返回非法0;

函数isspace 的工作原理?

  • isspace
  • int isspace(int c);
  • 所要包含的头文件: <ctype.h>
  • 参数的类型为int, 因为字符也可用ASCII码值来表示,况且字符的本质便是ASCII码值;
  • 返回值:返回类型为int ;当isspace 的参数为空白字符时,便会返回一个非0值;倘若其参数为非空白字符的时候,便会返回0;

为什么变量ret 的类型不为int 而为 long long ?

  • 因为还需要考虑一种情况:如果转换后的值超出了int可表示值的范围,那便返回一个非法0(标准未定义,但是在VS编译器下函数atoi 是这样处理的);而倘若变量ret 的类型为int ,那么所计算得到的结果存入ret 之中,即使超过了int 类型的取值范围,由于会发生截断,那么也便不知道此结果是否超过int 的取值范围,故而变量ret 的类型需要是一个大于4byte 的类型,即为long long;

变量ret 的作用?

ret 会将获得的每一位数转换成一个整体;

将每一位数合成一个整体有两种方法角度:

1、从低位到高位:将获取到的数字乘以不断递增的10 的次方,可以利用循环,也可以利用库函数 pow;

2、从高位到低位:即 ret = ret* 10 + i; 其中 i 为获取到的每一位的数字,ret 要初始化为0;如果需要带有符号,可以这样处理 : ret = ret * 10 + flag * i ; 其中 flag 代表着 + 或者 - ;


总结

atoi 函数的要求:

1、在字符串中如果首先遇到的是空白字符串,便会跳过这些空白字符串(可以利用库函数 isspace 进行操作)

2、可以识别 + 或者 - , 即atoi 返回的整型可以带上符号;

3、遇到数字字符便会将数字字符转换成数字;如果遇到非数字字符便会直接返回

4、函数atoi 返回的值可能会存在超出int 所表示的数据的范围;

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

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

相关文章

计算几何学习

凸包 凸组合&#xff0c; λ < λ 1 , λ 1 , . . . , λ n > T \lambda <\lambda_1,\lambda_1,...,\lambda_n>^T λ<λ1​,λ1​,...,λn​>T 其中 λ 1 λ 2 . . . λ n 1 \lambda_1\lambda_2...\lambda_n 1 λ1​λ2​...λn​1,且 λ i ≥ 0 \l…

深度解析 MintRich 独特的价格曲线机制玩法

随着 Meme 币赛道的迅速崛起&#xff0c;NFT 市场也迎来了新的变革。作为一个创新的 NFT 发行平台&#xff0c;Mint.Rich 正掀起一场全民参与的 NFT 热潮。其简易的操作界面和独特的价格曲线设计&#xff0c;让任何人都能以极低的门槛发行和交易自己的 NFT&#xff0c;从而参与…

多线程实现数据处理与打印分离

注意&#xff0c;结构体传入数据 一开始int* 不能变成void 传入int ** 也会失效&#xff0c; 只能一开始在message 结构体里有 int* 类型才能运行 这是通过打印表格得到的 使用raylib 开发 #include <raylib.h> #include <stdio.h> #include <math.h> #…

【零成本】七日杀 服务器搭建 异地联机 无需公网IP、服务器

主要内容 什么是七日杀 搭建前需要准备什么 详细步骤 1.Steam中下载七日杀服务器工具 2.修改七日杀服务配置文件 3.启动七日杀服务器应用 4.运行 MoleSDN 进行异地联机 5.小伙伴打开游戏加入 鼠鼠的服务器 什么是七日杀 《七日杀》是一款沙盒生存恐怖游戏&#xff0c;…

Linux shell编程学习笔记80:gzip命令——让文件瘦身

0 引言 在 Linux shell编程学习笔记76&#xff1a;tar命令——快照 & 备份&#xff08;上&#xff09;-CSDN博客 Linux shell编程学习笔记77&#xff1a;tar命令——快照 & 备份&#xff08;下&#xff09;_linux 系统快照-CSDN博客 Linux shell编程学习笔记78&am…

ai绘画文生图怎么制作?2024教你快速进行ai绘画

ai绘画文生图怎么制作&#xff1f;2024教你快速进行ai绘画 AI绘画技术的迅速发展&#xff0c;使得用户只需输入文本描述&#xff0c;就能生成符合要求的图像&#xff0c;这种“文生图”&#xff08;Text-to-Image&#xff09;功能使得绘画和创作变得简单、高效。以下是5款帮助…

Git提交有乱码

服务器提交记录如图 可知application.properties中文注释拉黄线 &#xff0c;提示Unsupported characters for the charset ISO-8859-1 打开settings - Editor - File Encodings 因为我们项目的其他文件都是UTF-8&#xff0c;所以&#xff0c;我们将默认值都改成UTF-8 然后…

【原创】java+springboot+mysql鲜花商城(花店)系统设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…

用于遥感深度学习的7种高光谱遥感图像和标签

数据介绍 此数据集来自于GIC(GRUPO INTELIGENCIA COMPUTACIONAL )官网 直达链接&#xff0c;采用MATLAB存储为矩阵形式&#xff0c;数据集后缀为.mat形式。每一个数据分为原始图像数据和标签数据&#xff0c;标签对应码请参考官网。注&#xff1a;此数据为公开数据&#xff0c…

20240915 每日AI必读资讯

国家网信办发布《人工智能生成合成内容标识办法&#xff08;征求意见稿&#xff09;》 - 要求所有的AI生成内容都要打标&#xff0c;包括文字、图像、视频、音频… - 文本内容要插入标识符提醒&#xff0c;音频内容要在里面插入提示音 - 对创作者不太友好&#xff0c;对平台…

PHP民宿管理APP---附源码74921

摘 要 随着旅游业的蓬勃发展和人们对个性化旅行体验的追求&#xff0c;民宿行业正迅速崛起并受到广大游客的青睐。民宿不仅为游客提供了更加亲近自然、体验当地文化的机会&#xff0c;同时也为房东带来了可观的经济收益。然而&#xff0c;随着民宿市场的不断扩大&#xff0c;民…

AI预测福彩3D采取888=3策略+和值012路或胆码测试9月14日新模型预测第87弹

经过80多期的测试&#xff0c;当然有很多彩友也一直在观察我每天发的预测结果&#xff0c;得到了一个非常有价值的信息&#xff0c;那就是9码定位的命中率非常高&#xff0c;80多期一共只错了8次&#xff0c;这给喜欢打私房菜的朋友提供了极高价值的预测结果~当然了&#xff0c…

自动驾驶:LQR、ILQR和DDP原理、公式推导以及代码演示(四、LQG和iLQG篇)

&#xff08;四&#xff09;LQG和iLQG原理、公式推导以及代码演示 在实际工程应用中&#xff0c;噪声是系统无法避免的因素&#xff0c;主要包括过程噪声和观测噪声。在自动控制、机器人、自主驾驶等领域&#xff0c;噪声的影响尤其显著。为了提高控制系统的鲁棒性和性能&…

MIPI CSI 接口定义与协议层介绍

文章目录 Definitions and AcronymsCSI-2 BriefD-PHYC-PHYM-PHYCSI-2 Layer DefinitionsMulti-Lane Distribution and MergingMulti-Lane InteroperabilityProtocol LayerLow Level ProtocolPacket FormatLong Packet FormatWhat does D-PHY Long Packet look like?What does …

类的初始化列表

文章目录 一、初始化列表1、初始化列表的使用2、必须使用初始化列表来初始化的成员 二、类型转换1、内置类型转换自定义类型2、自定义类型转换自定义类型 三、静态成员变量(static)1、static修饰成员变量2、静态成员函数 四、友元五、类里面再定义类六、匿名对象1、匿名对象的使…

大厂硬件梦:字节、腾讯“向首”,华为、小米“向手”

涉足可穿戴设备的大厂们&#xff0c;都抱着再造用户入口的野望&#xff0c;大模型治不好的痼疾&#xff0c;仍需继续前行寻找解药。 转载&#xff1a;科技新知 原创 作者丨茯神 编辑丨蕨影 苹果发布会再次令网友失望&#xff01;相比iPhone新机配色丑上热搜&#xff0c;反而苹…

Type-C与PD技术融合:重塑移动硬盘盒的未来

Type-C接口与PD充电技术&#xff1a;移动硬盘盒的革新之路 在数字化浪潮的汹涌澎湃中&#xff0c;我们的生活与工作环境被各式各样的电子设备所包围。从智能手机到平板电脑&#xff0c;从笔记本电脑到高清显示器&#xff0c;每一个设备都在以惊人的速度迭代更新&#xff0c;推…

集运系统:让海外集运包裹管理更简单!

随着全球化贸易的快速发展&#xff0c;海外包裹代收、仓储管理、退换货、国际快递等服务需求日益增长。集运系统作为一种专为海外客户提供一站式服务的软件系统&#xff0c;通过整合物流信息、管理订单、跟踪货物等功能&#xff0c;有效满足这些需求。本文将介绍集运系统的功能…

Python数据类型详解:这12个类型你都知道吗?

在Python中&#xff0c;数据类型是编程的基石&#xff0c;它们定义了可以操作的数据的种类。Python是一种动态类型语言&#xff0c;意味着你不需要显式地声明变量的类型&#xff1b;Python解释器会自动推断出变量所存储数据的类型。Python提供了多种内置数据类型&#xff0c;这…

立足本土,面向全球 | 全视通闪耀亮相Medical Fair Asia新加坡医疗展

Medical Fair Asia是亚洲地区最大的医疗设备、医疗器械和医疗技术展览会之一&#xff0c;自1997年创办以来&#xff0c;每两年在新加坡举办一次。该展会不仅是新加坡医疗行业交流的龙头平台&#xff0c;也是亚洲乃至全球医疗企业和专业人士共聚一堂、展示最新产品和技术的重要舞…