atoi函数详解

atoi函数使用方法

在c++官网中是这样介绍atoi函数的
在这里插入图片描述
通俗的讲就是把字符串中的字符数字转换为整形数字,遇到空格就跳过,如果在字符串开始遇到不是有效的整数比如说abc就直接返回0,如果遇到像这种情况123abc345这个就只返回123,这个函数包含在stdlib.h头文件里我们来试一下

# define _CRT_SECURE_NO_WARNINGS
# include<stdio.h>
# include<stdlib.h>

int main()
{
	char arr[] = { "   123abc345" };
	char arr1[] = { "  abcd123" };
	char arr2[] = { "  -123sdf" };
	char arr3[] = { "  @aq1234" };
	int ret = atoi(arr);
	int ret2 = atoi(arr1);
	int ret3 = atoi(arr2);
	int ret4 = atoi(arr3);
	printf("%d\n%d\n%d\n%d\n", ret,ret2,ret3,ret4);
	return 0;
}

在这里插入图片描述

模拟实现atoi

在模拟实现之前我们要考虑清楚有几种情况,第一种就是传的字符串是空指针,第二种是开头有空格需要跳过,第三种就是开头是除开0到9的字符,第四种就是开头是数字字符是正数还是负数,还有就是合法转换和非法转换。下面是代码

# define _CRT_SECURE_NO_WARNINGS
# include<stdio.h>
# include<ctype.h>
# include<stdlib.h>
# include<assert.h>
enum State
{
	VAILD,//不非法的 
	INVAILD//非法的
} state = INVAILD;

int my_atoi(const char* str)
{
	assert(str != NULL);
	if (*str == '\0')
	{
		return 0;
	}
	while (isspace(*str))
	{
		str++;
	}
	int flag = 1;
     if(*str == '-')
	{
		flag = -1;
		str++;
	}
	 if (*str == '+')
	 {
		 flag = 1;
		 str++;
	 }
	long long ret = 0;
	while (*str != '\0')
	{
		if (isdigit(*str))
		{
			ret = ret * 10 + (*str - '0')*flag;
			if (ret > INT_MAX)
			{
				return INT_MAX;
			}
			 if (ret < INT_MIN)
			{
				return INT_MIN;
			}
		}
		else
		{
			return (int)ret;
		}
		str++;
	}
	if (*str == '\0')
	{
		state = VAILD;
	}
	return (int)ret;
}
int main()
{
	char str[] = { "  -123abc34" };
	int ret = my_atoi(str);
	if (state == VAILD)
	{
		printf("合法转化:%d\n", ret);
	}
	else
	{
		printf("不合法转化:%d\n", ret);
	}
	return 0;
}

分布讲解

nt my_atoi(const char* str)
{
	assert(str != NULL);
	if (*str == '\0')
	{
		return 0;
	}
	while (isspace(*str))
	{
		str++;
	}
	int flag = 1;
     if(*str == '-')
	{
		flag = -1;
		str++;
	}
	 if (*str == '+')
	 {
		 flag = 1;
		 str++;
	 }

这一段代码就是解决如果 字符串中的第一个非空格字符序列不是有效的整数,或者由于空或仅包含空格字符而不存在此类序列,则不执行转换并返回零。还有遇到空格字符跳过的情况,这样用了一个函数isspace这个函数就是用来判断是不是空格字符,并且断言了一下传过来的字符串是不是空指针,
如果都不是就进入下面的if语句这里主要就是判断是正数还是负数,其实正数是不需要判断前面是不是有加号的,这样做就主要是为了防止有这样的字符串传过来像+123这种情况,这里设置了一个flag变量来判断是正数还是负数。

long long ret = 0;
while (*str != '\0')
{
	if (isdigit(*str))
	{
		ret = ret * 10 + (*str - '0')*flag;
		if (ret > INT_MAX)
		{
			return INT_MAX;
		}
		 if (ret < INT_MIN)
		{
			return INT_MIN;
		}
	}
	else
	{
		return (int)ret;
	}
	str++;
}

这段代码就除开那上面那些情况来进入下一步判断,首先我们设置了一个长整形来防止整形溢出,然后进入while循环当str字符串解引用不是字符串结尾\0的时候进行,下面进入if语句如果对字符串解引用是一个数字,这里用了一个isdigit函数来判断是否为数字。

ret = ret * 10 + (*str - '0')*flag;

这是一个数学公式用来把字符123变成数字123的,假如字符1想变成数字1就那字符一减去字符0,他们之间的ascii码差值就是数字1,在下面两个if就是一种比较特殊的情况了,在atoi函数定义中如果返回的数字大于intmax和小于intmin就直接返回intmax和intmin,最后那个else就是遇到除开0到9字符遇到其他字符就直接返回了,最后str指针自增1,我们来看看开头设置的一个枚举

enum State
{
	VAILD,//不非法的 
	INVAILD//非法的
} state = INVAILD;

这里就是用来判断返回的到底是合法还是非法的,合法的就是想把字符串中所有的数字都转换完了的就相当于把字符串都遍历了一遍,字符串指针走到了字符结尾非法的就是没有遍历完,没有走到字符串结尾。这里我们首先把他赋值为非法的

if (*str == '\0')
{
	state = VAILD;//这里就是判断字符串指针走没走完
}
if (state == VAILD)
{
	printf("合法转化:%d\n", ret);
}
else
{
	printf("不合法转化:%d\n", ret);
}

根据返回值来判断打印。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

申请Github Education获取免费Copilot权限(2024.3.18实测成功)

起因&#xff1a;旧帐户Copilot权限被封 我已经离开Github Copilot就无法独自耐着性子写代码了&#xff08;懒惰AI成瘾性&#xff09;&#xff0c;这两天Github Copilot不知道为什么在大规模封号&#xff0c;我不幸也被封号了&#xff08;禁用掉了Github Copilot权限&#xff…

大数据技术原理与应用 01.大数据概述

不可以垂头丧气&#xff0c;会显矮 —— 24.3.24 参考学习&#xff1a;厦门大学 林子雨老师 大数据技术原理与应用 一、大数据时代 大数据概念、影响、应用、关键技术 大数据与云计算、物联网的关系 ①三次信息化浪潮时代 ②第三次信息化浪潮的技术支撑 1>存储设备容量不断…

微服务(基础篇-003-Nacos)

目录 Nacos注册中心&#xff08;1&#xff09; 认识和安装Nacos&#xff08;1.1&#xff09; Nacos快速入门&#xff08;1.2&#xff09; 服务注册到Nacos(1.2.1) Nacos服务分级存储模型&#xff08;1.3&#xff09; 配置集群&#xff08;1.3.1&#xff09; 根据集群修改…

[ Linux ] git工具的基本使用(仓库的构建,提交)

1.安装git yum install -y git 2.打开Gitee&#xff0c;创建你的远程仓库&#xff0c;根据提示初始化本地仓库&#xff08;这里以我的仓库为例&#xff09; 新建好仓库之后跟着网页的提示初始化便可以了 3.add、commit、push三板斧 git add . //add仓库新增&#xff08;变…

阿里云倚天云服务器怎么样?如何收费?

阿里云倚天云服务器CPU采用倚天710处理器&#xff0c;租用倚天服务器c8y、g8y和r8y可以享受优惠价格&#xff0c;阿里云服务器网aliyunfuwuqi.com整理倚天云服务器详细介绍、倚天710处理器性能测评、CIPU架构优势、倚天服务器使用场景及生态支持&#xff1a; 阿里云倚天云服务…

AI预测福彩3D第17弹【2024年3月24日预测--第1套算法重新开始计算第14次测试】

今天周末&#xff0c;家里事情比较多&#xff0c;回来的比较晚&#xff0c;3D预测的结果只能在今天晚上7点半左右发布了。废话不多说了&#xff0c;直接上结果吧~ 最终&#xff0c;经过研判分析&#xff0c;2024年3月24日福彩3D的七码预测结果如下&#xff1a; 百位&#xff1a…

大宇、德国ODI、希亦超声波清洗机值得买吗?精品轻松分辨

长时间佩戴眼镜不清洗的话上面的细菌堪比马桶这么脏&#xff01;从佩戴眼镜开始就没有人告诉过我手动清洗眼镜会非常容易刮花镜片&#xff0c;是我自己佩戴眼镜这么长时间观察到的&#xff0c;后面了解到超声波清洗机可以很好的保护到眼镜&#xff0c;于是开始做功课挑选超声波…

对话李喆:Martech在中国需要转化成以客户需求为驱动的模式

关于SaaS模式在中国的发展&#xff0c;网上出现多种声音。Marteker近期采访了一些行业专家&#xff0c;围绕SaaS模式以及Martech在中国的发展提出独特观点。赛诺贝斯副总裁李喆认为&#xff0c;SaaS可以分为场景化的SaaS、一体化的SaaS和功能化的SaaS&#xff0c;三者都有一定规…

MultiArch与Ubuntu/Debian 的交叉编译

返回&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;基于ARM 的Linux系统的交叉编译 下一篇&#xff1a;MultiArch与Ubuntu/Debian 的交叉编译 警告&#xff1a; 本教程可能包含过时的信息。 什么是“MultiArch” OpenCV 可能…

Java 面试宝典:什么是大 key 问题?如何解决?

大家好&#xff0c;我是大明哥&#xff0c;一个专注「死磕 Java」系列创作的硬核程序员。 本文已收录到我的技术网站&#xff1a;https://skjava.com。有全网最优质的系列文章、Java 全栈技术文档以及大厂完整面经 回答 Redis 大 key 问题是指某个 key 对应的 value 值很大&am…

智慧农业害虫性诱监测专用设备-稻飞虱测报仪

TH-DF122随着科技的飞速发展和智慧农业的兴起&#xff0c;传统农业正在迎来一场革命性的变革。在这场变革中&#xff0c;智慧农业害虫性诱监测专用设备——稻飞虱测报仪&#xff0c;以其独特的魅力和高效的功能&#xff0c;正成为现代农业的得力助手。它不仅提升了农业生产的智…

Vue2(十):全局事件总线、消息订阅与发布、TodoList的编辑功能、$nextTick、动画

一、全局事件总线&#xff01;&#xff01; 任意组件间通信 比如a想收到别的组件的数据&#xff0c;那么就在a里面给x绑定一个demo自定义事件&#xff0c;所以a里面就得有一个回调函数吧&#xff0c;然后我要是想让d组件给a穿数据&#xff0c;那就让d去触发x的自定义事件&…

el-tree 使用按钮切换当前选中的节点(上一节点,下一节点)

<!-- 选择树上下切换 --> <template><div><el-tree:data"treeData":props"defaultProps"node-key "id"ref"tree"node-click"handleNodeClick"></el-tree><div><el-button click&qu…

Github Action Auto build docker Auto deploy

简介 整个流程比较清晰&#xff0c;实现的是基于Github 定向的往ECS做发布 探索 自动化打包发布一般流程&#xff1a; 本地环境打镜像 CI/CD 环境打镜像 以上的流程使用于比较大的项目&#xff0c;受限于环境&#xff0c;打算对上面流程做简化&#xff0c;使用github acti…

SpringBoot3+Vue3项目的阿里云部署--将后端以及前端项目打包

一、后端&#xff1a;在服务器上制作成镜像 1.准备Dockerfile文件 # 基础镜像 FROM openjdk:17-jdk-alpine # 作者 MAINTAINER lixuan # 工作目录 WORKDIR /usr/local/lixuan # 同步docker内部的时间 RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ…

Path MTU(路径最大传输单元)

目录 前言&#xff1a; IPV6不支持中间设备分片原因&#xff1a; IPV6报文分片使用的扩展报头&#xff08;44&#xff09;所包含的参数 IPv6报文分片过程 源节点分片数据包 前言&#xff1a; 在IPv4网络中&#xff0c;报文如果过大&#xff0c;则需要分片进行发送&#xf…

网络核心知识点 - 网络通信技术 XHR(XMLHttpRequest) 和 Fetch

一、关于 AJAX&#xff08;一种思想和方法&#xff09; 浏览器本身就具备网络通信的能力&#xff0c;但在早期&#xff0c;浏览器并没有把这个能力开放给JS。最早是微软在IE浏览器中把这一能力向JS开放&#xff0c;让JS可以在代码中实现发送请求&#xff0c;并不会刷新页面。Aj…

MS5910PA——10到16bit、内置参考振荡器 R/D转换器,替代AD2S1210

产品简述 MS5910PA 是一款可配置 10bit 到 16bit 分辨率的旋 变数字转换器。片上集成正弦波激励电路&#xff0c;正弦和余弦 允许输入峰峰值幅度为 2.3V 到 4.0V &#xff0c;频率范围为 2kHz 至 20kHz 。 转换器可并行或串行输出角度和速度对应的 数字量。 MS…

计算机软件安全

一、软件安全涉及的范围 1.1软件本身的安全保密 软件的本质与特征&#xff1a; 可移植性 寄生性 再生性 可激发性 攻击性 破坏性 …… 知识产权与软件盗版 软件商品交易形式不透明&#xff0c;方式多样&#xff0c;传统商标标识方法不适用&#xff1b; 盗版方法简捷…

IntelliJ IDEA集成git配置账号密码

1 背景说明 刚使用IDEA&#xff0c;本地也安装Git&#xff0c;在提交和拉取代码的时候&#xff0c;总提示登录框&#xff0c;而且登录框还不能输入账号密码&#xff0c;只能输入登录Token。如下&#xff1a; 从而无法正常使用IDEA的Git功能&#xff0c;很苦恼。 2 解决方法 …