0
点赞
收藏
分享

微信扫一扫

atoi的自我实现(超详细)

前言

今天给大家讲解一下,如何实现atoi这个函数 image.png image.png 大家可能看这个还是不理解,大概解释一下,就是将一个字符类型的数,转化为十进制的int类型,代码运行如下: image.png 大家看这里的字符串里的数是123,所以我们要打印出来的应该是整形类型的123(一百二十三): image.png 但是不仅仅是这样,这个函数还需要去判断,如果这个字符是空格,或者别的类型的空字符那么就跳过这个字符去判断下一个字符是什么,直到不是空白字符之后,就可以进行下一个判断,先给大家看一下这个函数对处理空白字符的做法: image.pngimage.png 如果,空白字符结束后是字符类型的数字,那么就是依旧按int类型打印出来,但是如果是'\0'那么就可以返回0的值,如下: image.png 大家看返回的值是0,还有就是如果我们的空格字符后面是除正负号和数字符号以外的字符,比如a,b,c之类的那些字符都进行返回0的操作,如下: image.png 大家可以看见,虽然我们的后面有数字字符但是前面有非数字字符和空白字符的话,就直接返回0,不用进行转换或其他的操作了,还有就是: image.png image.png 当我们前面是加减符号,我们就可以对输出的值进行正负号处理,但是: image.png 这种正负号同时存在的,他只判断一次正负号,如果后面还有非字符数字的值,一律按直接返回进行处理,包括这种: image.png image.png image.png只要是进行了数字判断或符号判断后(符号判断只进行一次,后面也一律按非数字字符处理),再出现任何非数字字符,都是将之前已经转换的值打印出来,到现在大家也应该理解这个函数的用途了,接下来是正文.

正文

我将这个函数分为了三部分, 第一部分判断,判断是空白字符还是什么其他字符(包含第二部), 第二部分,判断正负号, 第三部分,进行字符数字转换 好的,接下来是第一部分,判断: image.png 第一次循环我用到了一个库函数,因为要把其他什么空白字符什么的范围有点大,如果用ascll值来判断有些墨迹,于是就用这个函数isspace来判断,我给大家把这个函数的信息打印下来: image.png 返回值,参数如下 image.png 所以我们可以用while循环因为如果为假就返回跳出循环,每次判断一次就p++;p的地址指向下一位, 当不是空白字符之后就进行判断正负号和非数字字符,如果是正号,那么folg=0,如果是符号folg=1;否则就是不是加减运算符就可以跳出了,判断结束,下一个阶段,转换。 转换:image.png count是我用来存放数字字符个数的,每次循环count++,如果中途碰到了非数字字符,那么就直接跳出,不再进行count++;这就是为什么把判断放在放进入循环的位置,如果不是数字字符就直接跳出,最后记录数字字符的个数,现在正是开始转换的部分,将char类型转化为int类型,给大家画图解释一下: image.png,因为后面是/=10所以每次循环之后我的i的值都会成为之前的十分之一,直到最后1/10=0;跳出循环,但是在循环里也有一个判断,就是判断他是不是超过了最大值或者说小于了最小值,因为那样计算机可能就会有错误,所以直接返回0;image.png 我们的flog如果为0,就是整数返回ret,如果是1,就是负数,返回值是-ret; 就这样我们的atoi函数就实现了,但是其中还有一个小知识点我没有讲,就是我们要给p进行解引用,成为字符p,最后还需要去减去48,因为减去48就是将字符串转数字,其实减去48和减去一个'0'(字符0)是一样的效果,因为字符0的ascll值是48,和上面的意思是一样的。 好的,接下来代码如下:

#include<assert.h>
#include<stdlib.h>
#include <ctype.h>
////int atoi(const char* str);
#include<math.h>

long long my_atoi(const char* p)
{
	assert(p);
	while (isspace(*p))
	{
		p++; 
	}
	int flog = 0;
	if(*p > 57 || *p < 48)
	{
		if (*p == '+')
		{
			flog = 0;
			p++;
		}
		else if (*p == '-')
		{
			flog = 1;
			p++;
		}
		else
			return 0;
	}
	else	
	{
		long long ret = 0;
		const char* arr = p;
		int count=0;
		while (*p)
		{
			if (*p > 57 || *p < 48)
			{
				break;
			}
			count++;
			p++;
		}
		int i = 0;
		//123
		for (i = (int)pow(10, count - 1); i >0; i /= 10)
		{
			ret = ret + ( * arr-48)* i;
			arr++;
		if((ret > INT_MAX) || (ret < INT_MIN))
			{
			return 0;
			}
		}
		if (flog == 0)
		{
			return ret;
		}
		else
		return -ret;

	}
}
int main()
{
	char arr[20] = "     1+23";
	//printf("%lld\n", my_atoi(arr));
	printf("%d", atoi(arr));
	return 0;
}

运行结果如下: image.png 好的,这次的stoi函数讲解就到这里了,谢谢大家观看,希望帮助到大家。 再见!

举报

相关推荐

0 条评论