提升内功之模拟实现库函数atoi

news2025/5/22 11:37:46

本文包含知识点:

  • 库函数atoi的使用和模拟实现
  • 枚举常量的运用
  • fgets代替gets函数读取字符串
  • isspace isdigit库函数的使用

  • 一、库函数atoi的介绍与使用
    • atoi的介绍
    • atoi的使用细节
  • 二、库函数atoi的模拟实现

一、库函数atoi的介绍与使用

atoi的介绍

在这里插入图片描述

函数介绍

  • 头文件——<stdlib.h>
  • 函数功能:将字符串转换成整数
  • 返回值:如果转换成功,返回转换后的整数值
                   如果转换失败或者转换后的值超出int类型能表示的范围,这两种行为的返回值是C语言未规定的,不同的编译器有不同的实现,这里我们会参照vs2022的实现

atoi的使用细节

在这里插入图片描述

来,我们一个一个分析

  • ①输入字符串’12’,输出12
  • ②输入字符串’0’,输出0
  • ③输入字符串’-12’,输出-12
  • ④空字符串(不输入),输出0(我们实现的时候就可以自己设定别的返回值,因为用0当返回值会让用户不清楚输入是’0’还是空字符串)
  • ⑤空格字符串(输入几个空格),输出0(这里和④一样需要改造)
  • ⑥输入’123456789999999’,输出2147483647(整数123456789999999已经超出有符号int的最大值了,最大值就是2147483647,所以返回值就是2147483647。同理,输入的负数若是小于-2147483648,返回值就是-2147483648)
  • ⑦输入字符串’ 12’,输出12
  • ⑧输入字符串’12zbc34’,输出12(说明atoi读到字母就会停止)
  • ⑨输入字符串’abcd12’,输出0
  • ⑩输入字符串’-12abcd’,输出-12

二、库函数atoi的模拟实现

模拟实现atoi时我们需要处理的情况有如下几种

  • ①signed int范围内的正常输出,数值超出范围返回特殊值
  • ②输入空字符串和空格字符串时返回特定值
  • ③数字之前的空格和字母不读取,数字之后的字母也不读取
  • ④还有个未提及的问题,就是判断传入是否为空指针

下面是完整代码,关键代码和思路我都在代码上加了十分详细的注释

#include<stdio.h>//printf
#include<assert.h>//assert
#include<ctype.h>//isspace isdigit
#include <limits.h>//INT_MIN INT_MAX
//这里不要听编译器提示的给INT_MIN和INT_MAX加头文件<climits>,这是C++的头文件

enum State//返回值状态
{
	VALID,//有效的
	NULLSTR,//空字符串
	SPACESTR,//空格字符串
	OVERSTEP//超出范围
}state = VALID;//创建全局状态变量,初始值给VALID(大部分时正常返回的有效值)

int my_atoi(const char* str)
{
	assert(str);

	//这里我们要思考应该返回什么
	//如果和往常写函数的特殊返回值一样,空字符串返回0,那不和正常输入的'0'冲突了吗
	//所以我们引入枚举常量
	if (*str == '\n')// ''<——这就是空字符串,末尾有\0,但是由于我们输入的缘故,需要按回车,因此我们拿\n来判断
	{
		//因为stete是全局变量,所以函数结束之后可以通过state的值来判断return的0到底是何方神圣
		state = NULLSTR;
		return 0;
	}
	
	//跳过空格
	while (isspace(*str))//isspace函数返回值:如果*str是空格,返回0,反之返回非零值
	{
		str++;
	}
	//判断空格字符串
	if (!(*str))//*str == '\0'
	{
		state = SPACESTR;
		return 0;
	}

	//判断数字最开始的是否是正负号
	int flag = 1;
	if (*str == '-')
	{
		flag = -1;
		str++;
	}
	else if (*str == '+')
	{
		str++;
	}

	long long ret = 0;//能存放比int范围大的值,用于判断下面算出来的值是否越界
	while (*str)//*str != '\0'
	{
		if (isdigit(*str))//判断是不是数字字符,是则返回非零值,反之返回0
		{
			//我们所有的数据来源都是(*str - '0'),乘上flag之后能直接得到对应的正数或者负数,不用算出一个正数之后再去乘flag
			ret = ret * 10 + flag * (*str - '0');//'5' - '0' = 5    任意数字字符和字符0相减得到对应的数字
			if (ret < INT_MIN)
			{
				state = OVERSTEP;
				return INT_MIN;
			}
			else if (ret > INT_MAX)
			{
				state = OVERSTEP;
				return INT_MAX;
			}
		}
		else//直到不是数字时
		{
			state = VALID;
			return (int)ret;
		}
		*str++;
	}
	state = VALID;
	return (int)ret;
}

int main()
{
	int ret = my_atoi("-123");
	char buffer[256] = { 0 }; 
	while (1)
	{
		printf("Enter a number: ");
		fgets(buffer, 256, stdin);//代替gets
		ret = my_atoi(buffer);
		if (state == VALID)
		{
			printf("%d\n", ret);
		}
		else if (state == NULLSTR)
		{
			printf("NULLSTR!\n%d\n", ret);
		}
		else if (state == SPACESTR)
		{
			printf("SPACESTR!\n%d\n", ret);
		}
		else if (state == OVERSTEP)
		{
			printf("OVERSTEP!\n%d\n", ret);
		}
	}

	return 0;
}

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

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

相关文章

密码学学习笔记(十七 ):Edwards曲线数字签名算法 - edDSA

Edwards曲线数字签名算法(Edwards-curve Digital Signature Alogorithm, edDSA)由Daniel J. Bernstein等人在2011年提出&#xff0c;它是一种使用基于扭曲爱德华兹曲线的Schnorr签名变体的数字签名方案。 EdDSA的一个特殊之处在于&#xff0c;该方案不要求每次签名都是用全新的…

Spring项目如何创建?Bean对象是如何存储的?

博主简介&#xff1a;想进大厂的打工人博主主页&#xff1a;xyk:所属专栏: JavaEE进阶 目录 文章目录 一、创建Spring项目 1.1 创建Maven项目 2.2 配置国内源 二、Bean对象的存储和读取 2.1 添加spring配置文件 2.2 创建Bean对象 2.3 读取Bean对象 2.3.1 得到spring上下文对象…

前端技术Vue学习笔记--001

前端技术Vue学习笔记 文章目录 前端技术Vue学习笔记1、Vue2和Vue3比较2、Vue简介3、Vue快速上手4、插值表达式{{}}5、Vue响应式特性6、Vue指令6.1、v-html指令6.2、v-show指令和v-if指令6.3、v-else指令和v-else-if指令6.4、v-on指令6.4.1、v-on指令基础6.4.2、v-on调用传参 6.…

生命的样子

bbc纪录片《王朝》第一季就让我颇为震撼&#xff0c;第二季拖到现在才看&#xff0c;不过好在看了《晚酌de流派》之后&#xff0c;现在对待上好的游戏和视频都要颇有仪式感的情况下食用&#xff0c;夜深人静&#xff0c;配着暖灯&#xff0c;一杯茶&#xff0c;伴随大卫爱登堡的…

Lesson2——时间复杂度与空间复杂度

前言&#xff1a; 一个物品的好坏&#xff0c;我们可以通过体验、口碑、销量等因素判断。那一个算法的好坏我们怎么判断呢&#xff1f; 目录&#xff1a; 1. 算法的效率 2. 时间复杂度 3. 空间复杂度 4. 常见时间复杂度以及复杂度oj练习 一、算法的效率 1、如何衡量一个算…

react-draft-wysiwyg富文本编辑器

在React项目中使用 yarn add react-draft-wysiwyg draft-js or npm i react-draft-wysiwyg draft-js推荐在项目中单独创建一个富文本编辑器组件 import { Editor } from "react-draft-wysiwyg"; import { EditorState, convertToRaw, ContentState } from draft-js…

12、动手学深度学习——循环神经网络从零实现+Pytorch内置函数实现:代码详解

1、基础知识 参考文章&#xff1a;8.4. 循环神经网络 2、从零开始实现 本节将上述描述&#xff0c; 从头开始基于循环神经网络实现字符级语言模型。 这样的模型将在H.G.Wells的时光机器数据集上训练。 首先&#xff0c; 我们先读取数据集。 %matplotlib inline import math…

陆拾柒- 如何通过数据影响决策(二)

是否曾感觉自己已经很努力了&#xff0c;但却一直被人说表现的比以前差了。 虽然古语有云“眼见为实”&#xff0c;但着眼之处很有可能是错的。 一、某咖啡店近期销量 7月17日准备要开大会时&#xff0c;负责小程序渠道的同事看到7月17日趋势下跌之后&#xff0c;就开始想办法…

fatal: unable to connect to github.com:github.com[0:20.205.243.166]: errno=Unknown error

git&#xff1a;fatal: unable to connect to github.com:github.com[0:20.205.243.166]: errnoUnknown error 在 bash 执行命令 git clone 时 报 &#xff1a; fatal: unable to connect to github.com:github.com[0: 20.205.243.166]: errnoUnknown error 发生此错误是因为 g…

【C++】string类的模拟实现(增删查改,比大小,运算符重载)

文章目录 1.1大框架1.2基本函数&#xff1a;2.成员函数2.0构造函数2.05析构函数2.09拷贝构造函数补充&#xff1a;预留存储空间&#xff08;reserve&#xff09; 2.1增加字符&#xff08;push_back&#xff0c;append&#xff0c;s&#xff09;push_backappends 2. 删除字符&am…

SpringCloud-Alibaba之Seata处理分布式事务

一ID三组件模型 Transaction ID XID 全局唯一的事务ID Transaction Coordinator(TC) 事务协调器&#xff0c;维护全局事务的运行状态&#xff0c;负责协调并驱动全局事务的提交或回滚 Transaction Manager™ 控制全局事务的边界&#xff0c;负责开启一个全局事务&#xff0c;…

Java当中的深拷贝和浅拷贝

文章目录 一、前提二、浅拷贝1. BeanUtils实现浅拷贝 三、深拷贝1. 实现Cloneable接口并重写clone()方法&#xff1a;2. 使用序列化与反序列化&#xff1a; 一、前提 在计算机的内存中&#xff0c;每个对象都被赋予一个地址&#xff0c;该地址指向对象在内存中存储的位置。当我…

超详细图文教程:3DS Max 中创建低多边形游戏长剑模型

推荐&#xff1a; NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 在此&#xff0c;由两部分组成的教程的第一部分中&#xff0c;我将向您展示如何&#xff1a; 对剑柄进行建模剑的护手模型剑刃建模 1. 如何制作剑柄 步骤 1 在本教程中使用正交视图。要更改视图&#x…

uniapp小程序跳转其他小程序uni.navigateToMiniProgram效果demo(整理)

放点击事件里面即可 uni.navigateToMiniProgram({appId: , //跳转的小程序的aooIdpath: pages/index/index?id123, //如果这里不填&#xff0c;默认是跳转到对方小程序的主页面extraData: { //需要传给对方小程序的数据data1: test},success(res) {// 打开成功} })

Leetcode每日一题:42. 接雨水(2023.7.23 C++)

目录 42. 接雨水 题目描述&#xff1a; 实现代码与解析&#xff1a; 单调栈 原理思路&#xff1a; 动态规划 原理思路&#xff1a; 42. 接雨水 原题链接&#xff1a; 42. 接雨水 题目描述&#xff1a; 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;…

SVTR: 使用单一视觉模型进行场景文本识别【论文翻译】

&#x1f947; 版权: 本文由【墨理学AI】原创首发、各位读者大大、敬请查阅、感谢三连 &#x1f389; 声明: 作为全网 AI 领域 干货最多的博主之一&#xff0c;❤️ 不负光阴不负卿 ❤️ 文章目录 SVTR: Scene Text Recognition with a Single Visual ModelAbstract1 Introduct…

Ansible部署与实施PlayBook

Ansible部署与实施PlayBook 计算机名称IP角色workstation192.168.182.130管理servera192.168.182.131被管理serverb192.168.182.132被管理serverc192.168.182.133被管理 部署 控制节点 官方文档 Ansible易于安装。只需要安装到要运行它的一个或多个控制节点上。由Ansbile管…

【事业单位-语言理解】中心理解01

【事业单位-语言理解】中心理解01 一、中心理解1.1 转折关系1.2 因果关系1.3必要条件关系 二、总结 一、中心理解 1.1 转折关系 转折之后是中心意思 转折在分述句子中&#xff0c;就没有那么重要 1.2 因果关系 一方面另一方面起到的是分述的作用&#xff0c;一般不要过多…

python解析markdown

python解析markdown 1、安装markdown模块2、python解析markdown2.1 QtWebEngineWidgets显示网页2.1.1 网页加载2.1.2 网页加载错误 2.2 Python-Markdown 模块库2.3 QTextDocument、QTextBrowser、QTextEdit 3、案例Demo3.1 先上图3.2 代码文件 1、安装markdown模块 pip instal…

ElasticSearch学习--操作

目录 索引库操作 mapping映射 总结 创建索引库 查询删除修改索引库 总结 文档操作 添加 查询&#xff0c;删除 修改文档 总结 RestClient操作索引库 初始化JavaRestClient 创建索引库​编辑 删除索引库&#xff0c;判断索引库是否存在 总结 操作文档 新增文档 查询文…