【c语言】atoi的模拟实现

news2025/1/13 13:52:15

1.头文件

atoi() 是 C语言的一个标准库函数,定义在<stdlib.h>头文件中

2.atoi的解析

具体来讲,atoi() 函数首先会丢弃尽可能多的空白字符,直至找到第一个非空白字符,然后从该字符开始,识别 “+”、“-” 以及 0-9 之间的十进制数,最后将它们转换成整数。如果构成整数的后面还有其它字符,这些字符将会被忽略。

3.函数申明

在这里插入图片描述
参数
string:指向要转换的字符串。
如果由于 str 为空或者 str 字符串无法转换为整数,函数返回 0。

如果字符串表示的值超出了 int 类型所能表示的整数范围,函数返回的数值是int 最大值或最小值。

4.一些转化的例子

1.如果前面有+,转化后+号去掉在这里插入图片描述


2.如果是-号,则保留
在这里插入图片描述


3.传入的是空指针
在这里插入图片描述

在这里插入图片描述


  1. 有空格的话跳过
    在这里插入图片描述

5.空字符串的转化在这里插入图片描述


6.大于int类型最大值,转化为int类型的最大值
在这里插入图片描述


7.小于int类型最小值,转化为int类型的最小值
在这里插入图片描述


8.出现整数后面有其他字符截断.在这里插入图片描述


9.先出现其他字符比如a
在这里插入图片描述

5.函数实现

1.基本框架

enum State//枚举类型定义转化是否正常
{
	INVALID,//不正常
	VALID,//正常



}sta= INVALID;//先让其正常
int my_atoi(const char *str)//atoi的具体实现
{





}
int main()
{
	char arr[] = "1234";
	int ret = my_atoi(arr);//返回转化后的值
	if (sta == INVALID)//不正常转化
	{
		printf("非正常转化-%d",ret);


	}
	if (sta == VALID)//正常转化
	{printf("正常转化-%d", ret);
	}







}

2.处理空指针

int my_atoi(const char *str)//atoi的具体实现
{assert(*str);//处理空指针
}

3.处理空字符串

int my_atoi(const char *str)
{
	assert(*str);
	if (*str == '\0')//处理空字符串
	{                //处理空字符串
		return 0;    //处理空字符串


	}





}

4.处理空格

int my_atoi(const char *str)
{
	assert(*str);
	if (*str == '\0')
	{
		return 0;


	}
	while (isspace(*str))//处理空格
	{                    //处理空格
		str++;            //处理空格
	}





}

5.处理符号位

int my_atoi(const char *str)
{
	assert(*str);
	if (*str == '\0')
	{
		return 0;


	}
	while (isspace(*str))
	{
		str++;
	}
	int flag = 1;//符号位,如果为1则为正数,如果为-1则为负数,如果没加正号,默认为1;
	if (*str=='+')
	{
		flag = 1;
		str++;//跳过当前字符


	}
	else if (*str == '-')
	{
		flag = -1;
		str++;//跳过当前字符
    }





}

6.处理数字字符

int my_atoi(const char *str)
{
	assert(*str);
	if (*str == '\0')
	{
		return 0;


	}
	while (isspace(*str))
	{
		str++;
	}
	int flag = 1;
	if (*str=='+')
	{
		flag = 1;
		str++;



	}
	else if (*str == '-')
	{
		flag = -1;
		str++;
    }
long long r=0;//如果r 为int类型的话,超出范围,可能要截断,这里初始话为0,保证了空字符串返回0
	while (*str != '\0')//字符还未到末尾
	{
		if (isdigit(*str))//判断是否是字符
		{
			r = r * 10 + flag**str - '0';//得到字符对应的整数
			if (r > INT_MAX || r < INT_MIN)//如果超出范围
			{
				if (flag == 1)
				{
					return INT_MAX;//超出int 最大值,就返回最大值

				}
				if (flag == -1)
				{

					return INT_MIN;//超出int 最小值,就返回最小值

				}
			
			
			}
			str++;//指针移动下一个字符





		}
		else
		{
			return r;//如果str指向的不是字符的话,就返回r的值,比如1234a,此时r=1234
		}







	}





}

6.整体代码

#include<stdio.h>
#include <assert.h>
#include <ctype.h>
#include <limits.h>
#include<stdlib.h>
enum State
{
	VALID,
	INVALID


}sta= INVALID;
int my_atoi(const char* str)
{
	assert(*str);
	if (*str == '\0')
	{

		return 0;


	}
	while (isspace(*str))
	{
		str++;
	}
	int flag = 1;
	if (*str == '+')
	{
		flag = 1;
		str++;


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


				}
				else if (flag == -1)
				{
					return INT_MIN;
				}

				

			}

			str++;

		}
		else
		{
			return r;
		}
		




	}
	
		sta = VALID;
     
	return (int)r;






}



int main()
{
	char arr[] = "a111";
    int ret=my_atoi(arr);
	if (sta == VALID)
	{
		printf("正常输出%d",ret);



	}
	if (sta == INVALID)
	{
		printf("非正常输出%d",ret);

	}





}

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

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

相关文章

Python---循环---while循环

Python中的循环 包括 while循环与for循环&#xff0c;本文以while循环为主。 Python中所有的知识点&#xff0c;都是为了解决某个问题诞生的&#xff0c;就好比中文的汉字&#xff0c;每个汉字都是为了解决某种意思表达而诞生的。 1、什么是循环 现实生活中&#xff0c;也有…

华硕ROG吹雪和微星刀锋钛两者如何选择

## 华硕Rog系列主板里面的吹雪和微星主板里面的刀锋钛两者相比分别有什么特点&#xff0c;二选一应该选择哪个&#xff1f; 首先&#xff0c;要明确"吹雪"和"刀锋钛"并不是主板本身的名称&#xff0c;而是主板系列或某种设计风格的称呼。华硕和微星都是非常…

隐式类型转换

什么是隐式类型转换&#xff0c;多参数的造函数隐式类型转换&#xff0c;和单参数的构造函数隐式类型转换有什么区别 C中有三种主要的隐式类型转换&#xff1a; 1:多参数的构造函数隐式类型转换 2:单参数的构造函数隐式类型转换 3:成员函数隐式类型转换。…

【KingHistorian】新授权配置与使用说明

哈喽&#xff0c;大家好&#xff0c;我是雷工。 今天在现场安装KingHistorian的授权时&#xff0c;一时想不起来上次咋安装的了&#xff0c;真是好记性不如烂笔头&#xff0c;更何况记性还不咋地&#xff0c;又琢磨了半小时才想起来&#xff0c;现将授权配置与使用说明整理如下…

idea leetcode配置

idea leetcode配置 配置页面如下图所示&#xff0c;根据需要&#xff0c;填入登录用户名、密码、文件存放路径&#xff0c;注意如果要使用自定义的代码结构配置&#xff0c;要勾选图中框出来的选项。 Code FileName&#xff1a; $!velocityTool.camelCaseName(${question.tit…

零基础新手也能会的H5邀请函制作教程

随着科技的的发展&#xff0c;H5邀请函已经成为了各种活动、婚礼、会议等场合的常见邀约方式。它们不仅可以提供动态、互动的体验&#xff0c;还能让邀请内容更加丰富多彩。下面&#xff0c;我们将通过乔拓云平台&#xff0c;带领大家一步步完成H5邀请函的制作。 1. 选择可靠的…

H3C交换机 万兆光模块可以插在千兆光口上使用吗?

环境&#xff1a; S6520X-24ST-SI交换机 H3C LSWM1QSTK2万兆40G堆叠线QSFP 问题描述&#xff1a; H3C交换机 万兆光模块可以插在千兆光口上使用吗&#xff1f; 答案&#xff1a; H3C交换机的万兆光模块&#xff08;10 Gigabit Ethernet Module&#xff09;通常使用的是SFP…

基于主动移频法与AFD孤岛检测的单相并网逆变器仿真(Simulink仿真实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

光储并网直流微电网simulink仿真模型,光伏采用mppt实现最大功率输出研究

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

来看看 Discourse 3.2.0.beta2 版本添加的新功能

3.2.0.beta2 版本是在 2023-10-16 发布的&#xff0c;根据官方的说法&#xff0c;主要添加了 3 个新功能。 官方的发布日志页面&#xff1a;3.2.0.beta2: Auto delete unused tags, custom date range for reports, new chat notifications, and more - announcements - Disco…

专题:链表常考题目汇总

文章目录 反转类型&#xff1a;206.反转链表完整版二刷记录 25. K个一组反转链表1 &#xff1a;子链表左闭右闭反转版本2 &#xff1a; 子链表左闭右开反转版本&#xff08;推荐&#xff09;⭐反转链表左闭右闭和左闭右开 合并类型&#xff1a;21.合并两个有序链表1: 递归法2: …

解决方法:从客户端(---<A href=“http://l...“)中检测到有潜在危险的 Request.Form 值。

从客户端(-----<A href"http://l...")中检测到有潜在危险的 Request.Form 值。 解决方法&#xff1a;应该是不同的.net Framework版本对代码的校验不同&#xff0c;造成在高版本操作系统&#xff08;即高.net Framework版本校验&#xff09;不兼容&#xff0c;可…

YOLO目标检测——红白细胞血小板数据集【含对应voc、coco和yolo三种格式标签】

实际项目应用&#xff1a;红白细胞血小板计数和分类数据集说明&#xff1a;YOLO目标检测数据集&#xff0c;真实场景的高质量图片数据&#xff0c;数据场景丰富。使用lableimg标注软件标注&#xff0c;标注框质量高&#xff0c;含voc(xml)、coco(json)和yolo(txt)三种格式标签&…

【试题032】C语言关系运算符例题

1.题目&#xff1a;设int a2,b4,c5;&#xff0c;则表达式ab!c>b>a的值为&#xff1f; 2.代码分析&#xff1a; //设int a2,b4,c5;&#xff0c;则表达式ab!c>b>a的值为?int a 2, b 4, c 5;printf("%d\n", (a b ! c > b > a));//分析&#xff…

Python合并同类别且相交的矩形框

Python合并同类别且相交的矩形框 前言前提条件相关介绍实验环境Python合并同类别且相交的矩形框代码实现 前言 由于本人水平有限&#xff0c;难免出现错漏&#xff0c;敬请批评改正。更多精彩内容&#xff0c;可点击进入Python日常小操作专栏、YOLO系列专栏、自然语言处理专栏或…

攻防世界web篇-disabled_button

一个不能按的按钮&#xff0c;试过点击&#xff0c;确实是点不了&#xff0c;所以只能查看源代码喽 经过仔细查看&#xff0c;发现这里多了disabled&#xff0c;这个参数在linux中是禁止的意思&#xff0c;大概是这个意思吧&#xff0c;毕竟开机不自启就用这个参数 在控制台这…

REACH 附录XVII发布关于微塑料限制管控要求是什么?如何办理?

REACH 附录XVII发布关于微塑料限制管控要求 2023年9月27日&#xff0c;欧盟官方公报(0JEU)发布了法规(EU)2023/2055&#xff0c;在REACH法规附件XVII中增加了第78条对微塑料的新限制要求。 新的限制将从2023年10月17日起生效&#xff0c;部分物品的过渡期将从4年延长到12年。…

【Java 进阶篇】深入了解 Bootstrap 全局 CSS 样式

Bootstrap 是一个流行的前端框架&#xff0c;以其强大的全局 CSS 样式而闻名。这些样式能够帮助开发者快速创建漂亮的、响应式的网页&#xff0c;而无需从头编写复杂的 CSS。在本文中&#xff0c;我们将深入探讨 Bootstrap 的全局 CSS 样式&#xff0c;适合初学者&#xff0c;帮…

WAL 模式(PostgreSQL 14 Internals翻译版)

性能 当服务器正常运行时&#xff0c;WAL文件不断被写入磁盘。但是&#xff0c;这些写操作是顺序的:几乎没有随机访问&#xff0c;因此即使是HDD也可以处理这个任务。由于这种类型的加载与典型的数据文件访问非常不同&#xff0c;因此有必要为WAL文件设置一个单独的物理存储&a…

kibana查看和展示es数据(index pattern、discover、dashboard)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…