【C语言】atoi函数的模拟

atoi对于初学者来说大概率是一个陌生的函数

但不要害怕,我们可以通过各种网站去查询

例如:
cplusplus就是一个很好的查询网站

目录

函数介绍

我们发现这是一个将字符串转换为整形数字的函数

例如:

c 复制代码
int main()
{
	char str[] = "1234";
	int ret = atoi(str);
	printf("%d\n", ret);
	return 0;
}

在遇到不同字符串会有不同处理方法:

  1. 该函数首先根据需要丢弃尽可能多的空白字符(如在isspace中),直到找到第一个非空白字符。

  2. 从这个字符开始,接受一个可选的初始加号或减号,后面跟着尽可能多的以10为基数的数字,并将它们解释为数值。

  3. 字符串可以在组成整数的字符之后包含其他字符,这些字符将被忽略,并且对此函数的行为没有影响。

  4. 如果str中的第一个非空白字符序列不是有效的整数,或者由于str为空或仅包含空白字符而不存在这样的序列,则不执行转换并返回零。

模拟实现

模拟实现时我们就可以根据不同的处理方法进行操作

注意:

因为当你输入一个"a"时,输出为0

当输入一个"0"时,同样为一个0

故需要进行判断是否为一个合法的或是非法的

可以运行enum进行判断

c 复制代码
#include<stdio.h>
#include<ctype.h>
#include<assert.h>
#include<stdlib.h>
//atoi模拟
enum Judge
{
	VALID,
	INVALID
}judge=INVALID;

int my_atoi(char* str)
{

	assert(str);
	//判断指针是否为NULL
	int len = strlen(str);
	//判断是否为空字符串
	if (len == 0)
	{
		return 0;
	}
	//将空格跳过
	while (isspace(*str))
	{
		str++;
	}
	//进行正负号的判断,注意如果原字符串可能不带符号,故初始化为1
	int flag = 1;
	if (*str == '+')
	{
		flag = 1;
		//判断完正负号要进行++跳到下一个字符
		str++;
	}
	else if(*str == '-')
	{
		flag = -1;
		str++;
	}
	long long ret = 0;
	//注意溢出
	while (*str)
	{
		if (isdigit(*str))
		{
			ret = *str - '0' + ret * 10;
			//计算新的ret的值的式子
			if (ret > INT_MAX || ret < INT_MIN)
			//判断是否超出int的最大范围
			{
				if (flag == 1)
					return INT_MAX;
				else
					return INT_MIN;
			}
			str++;
		}
		else
			return flag * ret;

	}
	//运行到这时肯定是合法的
	judge = VALID;
	return flag * ret;
}

需要注意的点

  1. 我经常性的写数组时忘记带[],导致程序出错

  2. 在进行判别正负号时为了省事没有进行'-'判断,导致如果没有符号时程序出错

c 复制代码
	if (*str == '+')
	{
		flag = 1;
		str++;
	}
	else
	{
		flag = -1;
		str++;
	}

欢迎纠错与改正

相关推荐
雷✘7 小时前
C 程序从源文件到运行:预处理、编译、汇编、链接重定位与执行环境
c语言
传奇开心果编程7 小时前
【Rust入门练中学】 第1课:从零开始
开发语言·学习·rust
Logic1017 小时前
C语言/数据结构位运算题解:异或XOR找出数据表中的“独特编号“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
Brilliantwxx7 小时前
【STM32】 SPI阻塞式通信与HAL源码(串口读ID实战)
开发语言·stm32·单片机·嵌入式硬件·ecmascript
吠品7 小时前
Nginx负载均衡配置与线上故障排查的一些经验
java·开发语言·数据库
endeavor128 小时前
BootLoader与OTA学习(三)
c语言·stm32
边境悍匪8 小时前
蜗牛学苑 Java 智能体学习 Day44|Vue 前端项目搭建 思维导图复盘
java·开发语言·spring boot·学习·阿里云
wuyk5558 小时前
Python实战项目01:简易记事本系统
开发语言·python
君顾18 小时前
本地城市社区家政物业联动系统源码:架构设计与派单联动实战
java·开发语言·健身房
AI编码进化论8 小时前
云IDE介绍:环境模板化、Agent上云,云IDE该怎么选
开发语言·ide·人工智能·团队开发·ai编程