关于atoi函数的使用和模拟实现

本文详细介绍了C++中的atoi函数的工作原理,包括输入字符串解析规则,并展示了如何模拟实现一个自定义的my_atoi函数。作者通过实例和代码展示了如何处理加减号、数字字符以及边界值情况。
摘要由CSDN通过智能技术生成

        这篇文章是关于atoi函数是怎样使用的和我们如何模拟实现它的。话不多说,我们先从C++网站上关于atoi的函数信息入手。

函数分析

        首先我们可以看到它的返回值是int形参是一个字符串的首字母地址,它可以省略从字符串开始知道遇见的第一个非空白字符,如果不是加号或者减号或者字符数字,就直接返回0;如果除开非空格字符的第一个字符是加号或者减号,将加号或者减号保留,将后面的字符数字变为整形数字,然后知道遇到的不是字符数字为止,返回该数字,如果该数字大于int的最大值INT_MAX,则赋值为最大值,相反,小于了int的最小值就将它变为最小值输出。我们先写几个代码观察一下。

        可以看到,输出的结果,和我们上面讲解的基本相同。

        我们再用VS观察一下int的最大和最小值。

了解了上面这些东西之后,我们就可以动手自己写一个属于自己的atoi函数,我们先暂时把它命名为my_atoi吧。

模拟实现

首先我们肯定是要和它具有相同的形参。

int my_atoi(const char* arr)

我们第一步要做的就是从第一个元素开始判断是否是空格。我们可以用到isspace这个函数。

保存在<ctype.h>头文件里。

它可以用来检查字符是否是空白字符。我们可以像下面这样写。

	while (isspace(*arr))
	{	
		arr++;
	}

从第一个字符开始,如果是字符,isspace函数返回为真,就进入循环,地址加1,到下一个字符,知道不是空白字符。

到了第二步,我们该判断是否是加号或者减号了,我们可以写一个判断语句如下。

	int flag=1;
    if (*arr == '-')
	{
		flag = -1;
		arr++;
	}
	else
		if (*arr == '+')
		{
			arr++;
		}

我们再前面定义了flag=1,默认它是正数,如果满足判断语句,就进去修改flag的值,并且arr加1,让指针值到下一个字符。

下面终于轮到判断是否是数字字符了。这时我们还可以用到一个函数是isdigit,保存在<ctype.h>头文件里。

它的作用是判断字符是否是十进制的数字字符,如果是返回非零,否则返回零。

这个时候我们需要定义一个变量来储存我们的返回值了,我们定义了一个sum来接受,如果从我们正式开始判断的第一个字符就不是数字字符,就返回零。所以说我们使用了一个while循环来判断。

	while (isdigit(*arr))
	{    
        long long sum=0;
		sum =sum*10+ flag * (*arr - '0');
		arr++;
	}

如果是数字字符,我们就将它减去字符零,就得到了整形的数字,然后将它和flag相乘,flag代表我们的正负,赋给sum,依次类推。(注意:这里的sum定义为long long 是为了防止得到的值非常的大)。 

最后我们需要判断一下我们得到的sum是否大于INT_MAX,如果大于就返回最大值,相反,就返回最小值,如果都不满足就返回sum。代码如下。

	if (sum > INT_MAX)
		return INT_MAX;
	if (sum < INT_MIN)
		return INT_MIN;
	return sum;

我们还可以声明一个枚举变量states来表示是否是合法转换,就是是否走到了字符串的尽头'\0'。如果是,就是合法转换,如果不是,就是非法转换,让代码更加完美。

enum state {
	 VALUE,
	 UNVALUE
};

完整代码


enum state {
	 VALUE,
	 UNVALUE
};

int my_atoi(const char* arr)								//模拟实现atoi函数
{
	//1.atoi函数的作用就是将字符串数字转化为整形数字.
	//2.+-会影响这个数字的正负。
	//3.在这个字符串中,如果过出现了非数字字符,那就结束转换
	enum state states= UNVALUE;
	assert(arr);        //在这里需要判断arr不是空指针,用到了断言assert
	int flag = 1;
	long long sum=0;
	while (isspace(*arr))
	{	
		arr++;
	}
	if (*arr == '-')
	{
		flag = -1;
		arr++;
	}
	else
		if (*arr == '+')
		{
			arr++;
		}
	
	while (isdigit(*arr))
	{
		sum =sum*10+ flag * (*arr - '0');
		arr++;
	}
	if (*arr == '\0')
		states = VALUE;
	if (sum > INT_MAX)
		return INT_MAX;
	if (sum < INT_MIN)
		return INT_MIN;
	return sum;

}

下面我们来用我们自己做的atoi函数来实现和库函数的atoi函数是否相同。

可以对比和前面的结果相同。

总结

         好了,本节关于atoi函数的使用和模拟实现就讲到这,希望上面讲到的内容对大家有所帮助,如果有讲的不对的地方,还请大家指正,希望大家可以点赞,关注加收藏,谢谢大家。

  • 26
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值