【atoi函数的功能介绍及使用与模拟实现——超详细版本】

news2024/12/23 13:22:07

atoi函数的功能介绍及使用与模拟实现——超详细版本

1.cplusplus网站介绍💻

1.1atoi函数的功能介绍💻

在这里插入图片描述

它的功能:
解析将其内容解释为整数的 C 字符串,该整数作为 类型的值返回。
该函数首先根据需要丢弃尽可能多的空格字符(如 ),直到找到第一个非空格字符。然后,从此字符开始,取一个可选的首字母加号或减号,后跟尽可能多的 10 进制数字,并将它们解释为数值。
字符串可以在构成整数的字符之后包含其他字符,这些字符将被忽略,并且对此函数的行为没有影响。
如果 中的第一个非空格字符序列不是有效的整数,或者由于为空或仅包含空格字符而不存在此类序列,则不执行转换并返回零。

在这里插入图片描述
atoi函数功能是将数字字符串转换为整数;比如数字字符串"12345"被atoi转换为12345,数字字符串"-12345"被转换为-12345。

1.2返回值和接收数据类型介绍🧐

在这里插入图片描述

int atoi (const char * str);

返回类型是int整型,接收数据类型是字符串指针

1.3头文件🕵️

在这里插入图片描述

atoi函数所使用的头文件:#include <stdlib.h>。

1.4atoi函数使用实例✍️

在这里插入图片描述

**源码分享(需要自取)**🦍


#include <stdio.h>
#include <stdlib.h>
 
int main()
{
	char arr[100] = "12345";
	int ret = atoi(arr);
	printf("%d\n", ret);
	return 0;
}

2atoi函数模拟实现✍️

2.1初步模拟实现✍️

初步模拟实现可以把数字字符串转换为整数,由于没有考虑正负号,所以只能转换为正数;

还有很多特殊情况没有考虑,这里先来看看初步的模拟实现;

直接写还是比较麻烦的,这里先借助画图板来了解一下具体的思路:

在这里插入图片描述

2.1.1代码实现🦍

int my_atoi(const char* str)
{
	int n = 0;
	while (*str != '\0')
	{
		n = n * 10 + (*str - '0');
		str++;
	}
	return n;
}
int main()
{
	char arr[100] = "12345";
	int ret = my_atoi(arr);
	printf("%d\n", ret);
	return 0;
}

2.2atoi函数的具体实现(考虑6种特殊情况)🤯

**特殊情况:**🕵️

1.空指针
2.空字符串
3.字符串中的空格
4.非数字字符
5.溢出问题(所得数字大于INT_MAX或者小于INT_MIN)
6.正负号问题

**从哪方面考虑解决:**🧐

1.空指针的问题很容易解决:使用assert函数断言即可;
2.空字符串的第一个元素即为’\0’,在前面判断是否为’\0’返回就可以了,但是有一个问题,返回的0时原字符是’0还是空字符串,这里存在非法转换和合法转换,可以使用枚举解决,创建一个枚举类型初始化为非法,因为非法的情况比较多,合法的情况就一种。初识化为非法有利于问题的解决,空字符串转换为整数0是一种非法转换。
3.当遇到字符串中有空格的时候,可以直接跳过空格所在的内容,指针++指向下一个字符
4.非数字字符,例如"123a456",这里在指针走到a的时候,直接返回123就行了,不需要继续往下走了,此时是一种非法转换
5.溢出问题是数字字符的一种情况,当所得的n的值大于最大整型或者小于最小整型的时候,返回最大整型或者最小整型,溢出问题是一种非法转换
6.正负号的问题可以找一个变量flag来记录,初始化为1,当是正数的时候flag的值不变为1
若字符串中有’-',flag的值变为-1,记录符号位。

2.2.1代码实现🦍

#include<assert.h>
#include<limits.h>
#include<ctype.h>
enum Status
{
	VALID,
	INVALID
}; status = INVALID;//使用枚举进行初始化为非法
int my_atoi(char* str)
{
	int flag = 1;//记录符号位
	1.空指针问题
	assert(str);
		
		2.空字符串问题
		if (*str == '\0')
		{
			return 0;
		}
		3.空格问题
		while (*str == ' ')
		{
			str++;
		}
		4.+-号问题
		if (*str == '+')
		{
			flag = 1;
			str++;
		}
		if (*str == '-')
		{
			flag = -1;
			str++;
		}
	
	long long n = 0;
	while (*str != '\0')
	{
		非数字字符问题
		if (isdigit(*str))//isdigit函数是检查字符串是否为十进制数字
		{
			n = n * 10 + (*str - '0');
			溢出问题
			if (n > INT_MAX)
			{
				return INT_MAX;
				break;
			}
			if (n < INT_MIN)
			{
				return INT_MIN;
				break;
			}
		}
		else
		{
			不是数字字符直接跳出循环,此时的status还是INVALID
			break;
		}
		str++;
	}
	此时已经走到'\0'处了
	if (*str == '\0')
	{
		status = VALID;//走到'\0'就是合法转换
	}
	n *= flag;
	return (int)n;//强制转换为整型类型返回
}

2.2.2实例应用举例✍️

#include<stdio.h>
#include<assert.h>
#include<limits.h>
#include<ctype.h>
enum Status
{
	VALID,
	INVALID
}; status = INVALID;//使用枚举进行初始化为非法
int my_atoi(char* str)
{
	int flag = 1;//记录符号位
	1.空指针问题
	assert(str);
		
		2.空字符串问题
		if (*str == '\0')
		{
			return 0;
		}
		3.空格问题
		while (*str == ' ')
		{
			str++;
		}
		4.+-号问题
		if (*str == '+')
		{
			flag = 1;
			str++;
		}
		if (*str == '-')
		{
			flag = -1;
			str++;
		}
	
	long long n = 0;
	while (*str != '\0')
	{
		非数字字符问题
		if (isdigit(*str))//isdigit函数是检查字符串是否为十进制数字
		{
			n = n * 10 + (*str - '0');
			溢出问题
			if (n > INT_MAX)
			{
				return INT_MAX;
				break;
			}
			if (n < INT_MIN)
			{
				return INT_MIN;
				break;
			}
		}
		else
		{
			不是数字字符直接跳出循环,此时的status还是INVALID
			break;
		}
		str++;
	}
	此时已经走到'\0'处了
	if (*str == '\0')
	{
		status = VALID;//走到'\0'就是合法转换
	}
	n *= flag;
	return (int)n;//强制转换为整型类型返回
}
int main()
{
	char* arr = "   -123a45";
	int ret = my_atoi(arr);
	if (status == VALID)
	{
		printf("合法转换: ret = %d\n", ret);
	}
	else
	{
		printf("非法转换: ret = %d\n", ret);
	}

	return 0;
}

运行结果展示💻

在这里插入图片描述
制作不易,三连支持一下,可以吗(卑微版🥹) !!!

请添加图片描述

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

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

相关文章

java复习-eclipse开发工具使用

开发工具使用 项目文件结构 建立完成的项目目录中会自动创建有两个子目录&#xff1a; src&#xff1a;保存所有的 *.java 源文件bin&#xff1a;保存所有编译后的 *.class 程序文件&#xff0c;这些文件会自动进行编译处理 保存文件后&#xff0c;会自动进行编译。 快捷键…

无需专业技能,轻松创建个人博客:Cpolar+Emlog在Ubuntu上的搭建指南

文章目录 前言1. 网站搭建1.1 Emolog网页下载和安装1.2 网页测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2.Cpolar稳定隧道&#xff08;云端设置&#xff09;2.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 3. 公网访问测试总结 前言 博客作为使…

基于轻量级YOLOv5s开发构建隧道基建裂痕、脱落等缺陷问题检测系统

隧道内的定期检查与维护&#xff0c;对于及时发现和消除潜在的安全隐患有着重要的作用&#xff0c;基于人工的传统巡查方式不仅极为低效而且成本很高&#xff0c;将智能化的图像检测识别计数与实际的养护巡查场景相结合&#xff0c;开发构建智能AI检测识别系统是否可行&#xf…

C++QT day 5

实现一个图形类&#xff08;Shape&#xff09;&#xff0c;包含受保护成员属性&#xff1a;周长、面积&#xff0c; 公共成员函数&#xff1a;特殊成员函数书写 定义一个圆形类&#xff08;Circle&#xff09;&#xff0c;继承自图形类&#xff0c;包含私有属性&#xff1a;半…

element-table 行的拖拽更改顺序(无需下载sortableJs

样例展示&#xff1a;vueelement 通过阅读element文档我们发现element并不提供拖拽相关的api 本博客通过element提供的行类名 注册函数 实现行与行的拖拽 1.设置el-table 的行样式类名 这里是用的是 function <el-table:data"outputData":row-class-name&qu…

Codeforces Round 896 (Div. 2)题解

前言: 3 solved of 7 A、B、C,太菜了&#xff0c;写B题的时候&#xff0c;常数设成1e5了&#xff0c;一直卡在Test 4,没想到一直提示我TLE&#xff0c;没有提示RE&#xff0c;导致我浪费了很多时间在B题上&#xff0c;最后时间太晚了交了TLE了一发睡觉去了 A-Make It Zero …

SpringCloud:Feign实现微服务之间相互请求

文章目录 &#x1f389;欢迎来到Java学习路线专栏~SpringCloud&#xff1a;Feign实现微服务之间相互请求 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&#xff1a;IT陈寒的博客&#x1f388;该系列文章专栏&#xff1a;Java学习路线&#x1f4dc;其他专栏&#xf…

Sui Move智能合约提供更智能和简单的编程

编写区块链和其他计算环境的代码有很多相似之处&#xff0c;但区块链的重点大部分都集中在构建智能合约上。智能合约部署编译后的代码&#xff0c;本质上是在区块链上自动执行交易的apps。Sui网络本地的Sui虚拟机使用Sui Move编程语言编写智能合约。 术语“智能合约”意味着区…

Python之离线安装第三方库

1、场景介绍 在一些服务器上&#xff0c;我们搭建完Python环境之后&#xff0c;因为服务器的网络限制原因&#xff0c;不能直接通过pip命令下载安装Python的依赖包。 因此&#xff0c;我们需要在可以正常上网的服务器上下载好所需的依赖包文件&#xff0c;然后拷贝到目标服务器…

Screen的详细全面安装教程及Screen的用法

Screen可以大大提高终端使用效率&#xff0c;是Linux系统管理和运维的必备技能。当我们开启Screen后&#xff0c;只要Screen进程没有终止&#xff0c;其内部运行的会话都可以恢复。即使网络连接中断&#xff0c;用户也可以重新进入已开启的Screen中&#xff0c;对中断的会话进行…

Three.js-绘制矩形shader

绘制图中的嵌套矩形框 方法&#xff1a; vec3 drawRect(vec2 st,vec2 center,float width,float height,float thickness,vec3 fillColor, vec3 strokeColor) {vec3 color vec3(0);float halfWidth width * .5;float halfHeight height * .5;float halfTickness thicknes…

《向量数据库指南》——Milvus Cloud当初为什么选择向量数据库这个赛道呢?

我们公司专注于向量数据库大约可以追溯到 2018 年左右。当时&#xff0c;向量数据库的概念并不广泛。我们的 CEO 力排众议&#xff0c;认为这个领域有巨大潜力&#xff0c;因为这与我们的愿景高度契合。我们的公司定位是构建一个能够在云上处理非结构化数据的基础设施产品。经过…

window11wifi图标没了win11wifi图标消失连不上网的三种解决方法

最近win11系统有很多小伙伴都去安装体验,不过有的小伙伴在安装完之后说自己的wifi图标消失连不上网,那么如果遇到这种情况应该怎么办呢?下面就和小编一起来看看win11wifi图标消失连不上网的三种解决方法吧。 笔记本专用Win11娱乐版 V2023 [电脑系统] 笔记本专用Win11娱乐版…

UG\NX CAM二次开发 设置2D工序部件边界 UF_CAMBND_append_bnd_from_curve

文章作者:代工 来源网站:NX CAM二次开发专栏 简介: UG\NX CAM二次开发 设置2D工序部件边界 UF_CAMBND_append_bnd_from_curve 效果: 代码: static int init_proc(UF_UI_selection_p_t select, void* user_data) { int errorCode = 0; int num_triples = 1; …

自动创建设备节点udev机制的实现过程

udev是用户空间的一个应用程序&#xff0c;在内核里面安装一个驱动时&#xff0c;需要给这个驱动创建一个结点&#xff0c;安装驱动时向用户空间提交创建结点的信息&#xff0c;udev可以拿到提交的信息&#xff0c;自动在dev下创建结点。 创建结点的逻辑放在用户空间。内核空间…

每日刷题-5

目录 一、选择题 二、算法题 1、不要二 2、把字符串转换成整数 一、选择题 1、 解析&#xff1a;printf(格式化串&#xff0c;参数1&#xff0c;参数2,.….)&#xff0c;格式化串: printf第一个参数之后的参数要按照什么格式打印&#xff0c;比如%d--->按照整形方式打印&am…

JAVA设计模式6:代理模式,用于控制对目标对象的访问

作者主页&#xff1a;Designer 小郑 作者简介&#xff1a;3年JAVA全栈开发经验&#xff0c;专注JAVA技术、系统定制、远程指导&#xff0c;致力于企业数字化转型&#xff0c;CSDN博客专家&#xff0c;阿里云社区专家博主&#xff0c;蓝桥云课讲师。 目录 一、什么是代理模式二、…

c++day5---9.12

实现一个图形类&#xff08;Shape&#xff09;&#xff0c;包含受保护成员属性&#xff1a;周长、面积&#xff0c; 公共成员函数&#xff1a;特殊成员函数书写 定义一个圆形类&#xff08;Circle&#xff09;&#xff0c;继承自图形类&#xff0c;包含私有属性&#xff1a;半径…

AMD R7 7840HS 核显 780M 性能怎么样

目录 1. 基本数据 2.性能对比 2.1对比一 2.2 对比二 3.综合 1. 基本数据 2.性能对比 2.1对比一 锐龙77840h相当于i几 答&#xff1a;类似于I7-12700H R7 7840H介于13500-13700之间。 R7 7840H是AMD锐龙旗下高性能的一款处理器&#xff0c;主要应用在主流的游戏本中。各…

教育领域数据可视化:点亮知识之路

教育领域一直以来都在不断进步和演变&#xff0c;而数据可视化技术正在为这一领域带来一场革命。在过去的几年里&#xff0c;教育者们越来越意识到&#xff0c;通过将教育数据转化为可视化图表和图形&#xff0c;可以更好地理解学生的表现、需求和趋势&#xff0c;从而提供更好…