【C语言】atoi函数模拟实现


一、atoi函数是什么?

int atoi ( const char * str );

功能:将字符串转换为整数。
解析C字符串str,将其内容解释为一个整数,该整数作为int值返回。

该函数首先丢弃尽可能多的空白字符,直到找到第一个非空白字符。然后,从这个字符开始,取一个可选的初始加号或减号,后面跟着尽可能多的数字,并将它们解释为一个数值。 例:" -123456" 转换为 -123456

字符串可以在构成整数的字符之后包含其他字符,这些字符将被忽略,并且对该函数的行为没有影响。例:" 123abc456" 转换为 123,虽然最终的输出结果是一个整数,但这属于非法转换

如果str中的第一个非空白字符序列不是有效的整数,或者由于str为空或只包含空白字符而不存在这样的序列,则不执行转换。例:“abc” " abc" “” 为非法转换,最终会输出整数0。

字符串整数合法性
" 123456"123456合法
“-123456”-123456合法
“123abc456”123非法
“abc”0非法
“”0非法
“2222222222”任意值非法

注:当转换的值超出int可表示值的范围时会发生什么,没有标准规范。
例:在VS2013编译环境下输出的数值
在这里插入图片描述

二、atoi函数模拟实现

#include <stdio.h>
#include <limits.h>
#include <ctype.h>

//通过枚举设置两种状态,分别代表字符串转换的合法性
enum Status
{
	VALID,  //合法
	INVALID  //非法
};

enum Status status = INVALID; //定义全局变量 status 为 INVALID,若转换合法,则将 status 变为 VALID,若非法则不变

int my_atoi(const char* str)
{
	if (str == NULL)  //字符串为空
	{
		return 0;
	}
	if (*str == '\0')  //空白字符
	{
		return 0;
	}
	while (isspace(*str))  //字符串前面有多余的空格,则一直往后移寻找符号或数字
	{
		str++;
	}
	int flag = 1;  //flag 标志数字的正负
	if (*str == '+')
	{
		flag = 1;
		str++;
	}
	else if (*str == '-')
	{
		flag = -1;
		str++;
	}
	long long ret = 0;
	while (isdigit(*str))
	{
		ret = ret * 10 + flag*(*str - '0');
		if (ret<INT_MIN || ret>INT_MAX)  //判断转换后的数字是否越界
		{
			return 0;
		}
		str++;
	}
	if (*str == '\0')  //若字符串遍历完就走这一步,也就意味着该字符串的转换为合法的
	{
		status = VALID;
		return (int)ret;
	}
	else  //非法转换
	{
		return (int)ret;
	}
}

int main()
{
	//int ret = my_atoi("-123");
	int ret = my_atoi("  -2222222222");
	if (status == VALID)
	{
		printf("合法的转换:%d\n", ret);
	}
	else
		printf("转换不合法!返回值为:%d\n",ret);
	return 0;
}

总结

基本上该函数的模拟实现要注意的细节都在上面的代码注释里。

还要再解释的是为什么要将返回值定义成 long long 长整型,而不是stoi函数的返回值 int 型呢?

这是因为在计算求和的时候万一出现越界,由于之前将返回值定义为 int 型,这时就会将已经越界的数字强制转换为非越界的数字,那么就会导致错误的输出结果和错误的合法性判断。

评论 39
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

情话0.0

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

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

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

打赏作者

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

抵扣说明:

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

余额充值