什么是atoi函数,就是把字符串转成数字,比如你输入“123”,系统就会输出123(整形),这就是atoi函数,这么一个看似简单的函数,实际写起来能学到多少知识呢?
我们慢慢看。
如何实现这个函数?
最简单的方式有人一下就能想到:
int My_atoi(char *str)
{
if(str == NULL)
{
return 0;
}
int num = 0;
while(*str! = ‘\0’)
{
num = num*10 + (str-“0”);
str++;
}
return num;
}
这看似完成了atoi函数的实现,实际上太多的问题没有考虑进去:
- 输入的空字符串和字符“0”输出的结果一样,没法判断是字符“0”还是空字符串
- 输入负数时,前面的“-”没法判断
- 通过上面这个问题,如果只输入“+”或者“-”,又改怎么样?
- 输入其他字符如“#%&*……”等字符没有进行判断
- 如果超出整形数字的范围,该怎么判断?
把这么都考虑上,我们能学到那些东西呢?
针对第一点:系统的atoi函数是通过一个全局变量进行空字符串和字符“0”的判断,输入空字符串全局变量会改变,而字符“0”不会改变。
这里又引入了一个枚举类型的关键字:enum
enum是一种枚举数据类型,目的是解决一些无法用当前数据类型无法描述的数据类型,比如一周有七天,一年有十二个月就可以用枚举类型enum来实现:enum 枚举名{枚举值表}
举例:enum week{sun,mon,tue,wed,thu,fri,sat};
这个枚举类型可以帮我们设置全局变量,使得更改全局变量的值。
在我们考虑了以上问题时,我们接下来就完成代码吧:
enum Stat(kivd = 0,kivd1);//枚举类型
int q_Stata = kivd;//全局变量
int My_atoi(char *str)
{
q_Stata = kivd1;
int num = 0;
if(*str != NULL || *str!= ‘\0’)
{
bool Ta = true;//正数为真,负数为false
if(*str == ‘+’)
{
str++;
}
else if(*str == ‘-’)
{
Ta = false;
str++;
}
if(*str != ‘\0’)//如果正负号之后还有字符,则进入转换字符
{
num = Atoi_Main(str,Ta);
}
}
return num;
}
以上是判断函数,以及安全处理
int Atoi_Main(char *dig , bool Tb)
{
int num;
while(*str!=’\0’)
{
if(*str>= ‘0’ && *str<=’9’)
{
int flat = Tb?1:-1;//判断正负
num = num * 10 + (flat*(*dig –‘0’));//进行转换
if(Tb && num > 0x7FFFFFFF
|| (!Tb && num < (signed int)0x80000000))
//判断如果是正数并且超出整形最大范围,负数是否超出最大范围
{
num = 0;
break;
}
}
else
{
num = 0;
break;
}
}
if(*str == ‘\0’)//如果遍历完成到了最后的结束字符,说话字符串没问题
{
q_Stata = kivd;
}
return num;
}
一个看似简单的atoi函数,你能学到多少知识?