C语言简单实现atoi函数

什么是atoi函数?

把字符串转换成整型数的一个函数。

那现在我们来实现如何构造出这个函数

1.首先创建出主函数和自定义函数

int main()
{

   char ch[] ="1234"; 
   return 0;
}

我们如何去实现将字符串1234转换成整形呢?

我们这里引入了一个my_atoi的自定义函数。

并且为了对于ch数组和数组指针加上const使代码更为健壮。

​
​
​
​
int my_atoi(const char* s)
{

   
}
int main()
{
	const char* p = "1234";
	int ret = my_atoi(p);
    return 0;
}

​

​

​

​

2. 那接下来我们要在my_atoi函数中写什么呢?

2.1 我们要进行对传入来的字符串的判断。

(1)是否传来的字符串为空字符串?

(2)是否传来的为空指针?

(3)传来的字符串是否只有数字字符?

(4)对于转换数字的正负判断

对于这类问题我们要一一讨论

因此我们的my_atoi函数可以添加如下内容

int my_atoi(const char* s)
{
	int flag;
	//assert(s != NULL);
	if (s == NULL)
		return 0;
	if (*s == '\0')
		return 0;
	//跳过空白字符
	while (isspace(*s))//是空白字符返回非0值 非空白字符不进入
	{
		s++;
	}
	//处理+-
	if (*s == '+')
	{
		flag = 1;
		s++;
	}
	else if (*s == '-')
	{
		flag = -1;
		s++;
	}
}

2.2 那我们是如何判断接下来的字符都是数字字符呢?

我们引入了一个新的函数 - isdigit,通过此函数可以判断是否为数字字符,那接下来我们就要进行如何将一个数字字符转换称一个十进制数字。

那写到了这里我们已经斩断了几乎所有的困难,那接下来我们需要写出我们的主要步骤 - 把字符串转换成数字。

2.3 如何把数字字符转换称数字

首先我们可以通过观看ASCII表可以看出字符1-9与数字1-9的关系

可以得知当'9'-'0'=9、'8'-'0'=8,可以推出数字字符等于数字加上'0'的ASCII。

因此我们的代码可以如下图所示

while (isdigit(*s))
	{
		n = n * 10 + (*s - '0') * flag;
		if (n > INT_MAX || n < INT_MIN)
		{
			return 0;
		}
		s++;
	}

我们的基本代码就写出来了,但如果考虑数字字符以后有着其他字符呢?

我们可以引入一个全局变量来定义是否合法转化

enum state
{
	INVALID, //0
	VALID //1
};
enum state STATE = INVALID;//记录是合法访问的值还是非法访问的值

然后对数字字符后位进行判断

//非数字字符或\0
    if (*s == '\0')
    {
        STATE = VALID;
        return n;
    }
    else//非数字字符
    {
        STATE = INVALID;
        return n;
    }                        
}

通过对后位的判断来决定是否为合法转化。

最后请看整理出的代码:

​
enum state
{
	INVALID, //0
	VALID //1
};
enum state STATE = INVALID;//记录是合法访问的值还是非法访问的值
int my_atoi(const char* s)
{
	int flag;
	//assert(s != NULL);
	if (s == NULL)
		return 0;
	if (*s == '\0')
		return 0;
	//跳过空白字符
	while (isspace(*s))//是空白字符返回非0值 非空白字符不进入
	{
		s++;
	}
	//处理+-
	if (*s == '+')
	{
		flag = 1;
		s++;
	}
	else if (*s == '-')
	{
		flag = -1;
		s++;
	}
	//处理数字字符的转换
	long long  n = 0;
	while (isdigit(*s))
	{
		n = n * 10 + (*s - '0') * flag;
		if (n > INT_MAX || n < INT_MIN)
		{
			return 0;
		}
		s++;
	}
	//非数字字符或\0
	if (*s == '\0')
	{
		STATE = VALID;
		return intn;
	}
	else//非数字字符
	{
		STATE = INVALID;
		return intn;
	}                        
}
#include<string.h>
int main()
{
	const char* p = "1234";
	int ret = my_atoi(p);
	if (STATE == VALID)
		printf("合法的转换:%d", ret);
	else
		printf("非法的转换:%d", ret);
	return 0;
}

​

谢谢观看!

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值