这篇文章是关于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++;}elseif (*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.在这个字符串中,如果过出现了非数字字符,那就结束转换//4.如果转换后的数字大于int的最大或最小值,就按最大或者最小值计算。enum state states= UNVALUE;assert(arr);int flag = 1;long long sum=0;while (isspace(*arr)){ arr++;}if (*arr == '-'){flag = -1;arr++;}elseif (*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函数的使用和模拟实现就讲到这,希望上面讲到的内容对大家有所帮助,如果有讲的不对的地方,还请大家指正,希望大家可以点赞,关注加收藏,谢谢大家。