【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++;
	}

欢迎纠错与改正

相关推荐
jk_10118 分钟前
MATLAB中decomposition函数用法
开发语言·算法·matlab
weixin_4640780718 分钟前
C#串口温度读取
开发语言·c#
无敌の星仔20 分钟前
一个月学会Java 第2天 认识类与对象
java·开发语言
豆豆43 分钟前
为什么用PageAdmin CMS建设网站?
服务器·开发语言·前端·php·软件构建
落落落sss1 小时前
MybatisPlus
android·java·开发语言·spring·tomcat·rabbitmq·mybatis
简单.is.good2 小时前
【测试】接口测试与接口自动化
开发语言·python
Yvemil72 小时前
MQ 架构设计原理与消息中间件详解(二)
开发语言·后端·ruby
程序员是干活的2 小时前
私家车开车回家过节会发生什么事情
java·开发语言·软件构建·1024程序员节
我是陈泽2 小时前
一行 Python 代码能实现什么丧心病狂的功能?圣诞树源代码
开发语言·python·程序员·编程·python教程·python学习·python教学
优雅的小武先生2 小时前
QT中的按钮控件和comboBox控件和spinBox控件无法点击的bug
开发语言·qt·bug