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

欢迎纠错与改正

相关推荐
Elias不吃糖20 分钟前
NebulaChat:C++ 高并发聊天室服务端
开发语言·c++·redis·sql·项目文档
haofafa24 分钟前
JavaScript性能优化实战
开发语言·javascript·性能优化
帅中的小灰灰30 分钟前
C++编程策略设计模式
开发语言·c++·设计模式
O***p60436 分钟前
JavaScript增强现实开发
开发语言·javascript·ar
Antonio91544 分钟前
【Swift】Swift基础语法:函数、闭包、枚举、结构体、类与属性
开发语言·swift
csbysj20201 小时前
Vue3 事件处理
开发语言
Q***f6351 小时前
Kotlin在Android性能优化中的工具
android·开发语言·kotlin
菠菠萝宝2 小时前
【Java手搓RAGFlow】-9- RAG对话实现
java·开发语言·人工智能·llm·jenkins·openai
leon_zeng02 小时前
Qt OpenGL 3D 彩色立方体开发指南
开发语言·qt
科威舟的代码笔记2 小时前
第10讲:Stream实战与陷阱——综合案例与最佳实践
java·开发语言