模拟实现【atoi】

函数介绍

在这里插入图片描述

atoi函数的功能:分析 C 字符串 str,将其内容解释为整数,该整数作为 int 类型的值返回。

  • 该函数首先根据需要丢弃尽可能多的空格字符,直到找到第一个非空格字符。

  • 然后,从此字符开始,取一个可选的initial plus or minus ,后跟尽可能多的 10 进制数字,并将它们解释为数值。

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

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

Return Value:int

逐步实现

  1. 如果 str 为空,不执行转换并返回零 👉 *str=='\0'
if ('\0' == *str)//str为空 → 不执行转换并返回零
	{
		return 0;
	}
  1. 丢弃尽可能多的空格,去寻找第一个非空字符
while (isspace(*str))//丢弃尽可能多的空格字符
	{
		str++;
	}//当寻找到第一个非空字符之后跳出循环
  1. 找到第一个非空字符之后处理正负号
int flag = 1;//标记正负号
	if ('-' == *str)
	{
		flag = -1;
		str++;
	}
  1. 处理数字字符
  • 拿一个long long类型的变量 num 接收转换后的字符 👉 因为转换后的数值可能发生越界
long long num = 0;//用于接收转换后的数字
if (num<INT_MIN || num>INT_MAX)   
    return 0;//“负”越界或“正”越界
  • 数字字符的数值=‘字符本身’ - ‘0’
num = num * 10 + flag * (*str - '0');

例如:“-123”
👉 num = 0×10+(-1)×(‘1’-‘0’)= -1
👉 num = -1×10+(-1)×(‘2’-'0) = -10+(-2) = -12
👉 num = -12×10+(-1)×(‘3’-‘0’) = -120 + (-3) = -123

  1. 继续往后走,跳出循环的两种可能:找到字符串的末尾’\0’,或者遇到非有效的数字字符(字符串可以在构成整数的字符之后包含其他字符,这些字符将被忽略,并且对此函数的行为没有影响。)
if ('\0' == *str)//跳出循环的第一种可能 → 转换数字成功
	{
		status = valuable;//代表合法的转换
		return (int)num;
	}
	if (!isdigit(*str))//跳出循环的第二种可能 → 遇到非数字字符 or 找到的第一个非空字符不是有效的数字字符
	{
		return (int)num;//构成整数的字符之后包含其他字符将被忽略
	}

ps.枚举变量enum Status status只是用于判断是合法转换还是异常转换,这里定义当且仅当所给字符串不为空且除有效数字字符外仅含有空格字符的情况才能被合法转换。atoi函数本身无法判断是否合法转换。

完整源码

//模拟实现atoi
#include <stdio.h>     
#include <ctype.h>
#include <limits.h>
#include <assert.h>
enum Status
{
	valuable,
	invaluable
}status;

status = invaluable;

int My_atoi(const char* str)
{
	assert(str);
	if ('\0' == *str)//str为空 → 不执行转换并返回零
	{
		return 0;
	}
	while (isspace(*str))//首先需要丢弃尽可能多的空格字符
	{
		str++;
	}//当寻找到第一个非空字符之后跳出循环
	int flag = 1;//标记正负号
	if ('-' == *str)
	{
		flag = -1;
		str++;
	}
	//处理数字字符
	long long num = 0;//用于接收转换后的数字
	while (isdigit(*str))
	{
		num = num * 10 + flag * (*str - '0');
		if (num<INT_MIN || num>INT_MAX)
		{
			return 0;//“负”越界或“正”越界
		}
		str++;
	}
	if ('\0' == *str)//跳出循环的第一种可能 → 转换数字成功
	{
		status = valuable;//代表合法的转换
		return (int)num;
	}
	if (!isdigit(*str))//跳出循环的第二种可能 → 遇到非数字字符 or 找到的第一个非空字符不是有效的数字字符
	{
		return (int)num;//构成整数的字符之后包含其他字符将被忽略
	}

}

int main()
{
	int a = My_atoi("1234d");
	int c = My_atoi("ab12");
	int d = My_atoi("");
	int e = My_atoi("        -324");

	printf("a=%d c=%d d=%d e=%d \n", a, c, d, e);

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

畋坪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值