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

欢迎纠错与改正

相关推荐
彧azz16 小时前
图的存储结构详解:邻接矩阵的原理、实现与应用
开发语言·数据结构·学习·php
嵌入式学习菌17 小时前
Modbus‑RTU 数据类型分析
开发语言·单片机·bug
matlab代码18 小时前
基于matlab数字图像处理的指纹识别系统【源码68期】
开发语言·matlab
matlab代码18 小时前
基于matlab的水果识别系统(苹果香蕉菠萝梨桃子)【源码65期】
开发语言·matlab
wuyk55518 小时前
从零吃透 MQTT 通信|第 8 章 FreeRTOS 多任务架构下 MQTT 工程架构,任务拆分、队列解耦、临界区保护
c语言·开发语言·stm32·学习·架构
weixin1997010801618 小时前
[特殊字符]《跨境二手ERP对接Back Market:标准化API + 7~10工作日技术合规审核实录》(附Python源码)
开发语言·python·pandas
尘客-追梦19 小时前
Day 01:插件化之前,先看清 ABI 这堵墙
开发语言·c++·qt
持敬chijing19 小时前
Python-数据类型-列表
开发语言·python·青少年编程
xx~t19 小时前
嵌入式——51单片机1
linux·c语言·单片机·嵌入式硬件·51单片机
写后端的胖头鱼20 小时前
【高频面试题】Java 基础类型 + 包装类 + String 互相转换
java·开发语言