实现atoi()函数开始之前,测试了库中的atoi()函数,发现库中提供的atoi函数可以处理许多异常,下面就是库中可以处理的异常:
1.指针为NULL
2.空字符串
3.(+,-)号处理
4.遇到异常字符时的处理方式
5.溢出时处理,分为两部分:
1).上溢出,输出上界
2).下溢出,输出下界
那么对这些异常进行处理就可以完成一个简单atoi()函数了。
代码实现:
/*My_Atoi.c*/
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <limits.h>
typedef enum Ret
{
VALID,
INVALID
}Ret;
Ret state = INVALID; //用来判断异常的全局变量
int My_Atoi(const char* str)
{
int flag = 1; //正负
long long ret = 0; //返回值
assert(str);
if(str == NULL) //空指针
{
return (int)ret;
}
if(str == '\0') //空字符串
{
return (int)ret;
}
while(*str == ' ') //空白字符
{
str++;
}
if(str == '\0') //空白字符串
{
return (int)ret;
}
else if(*str == '+' || *str == '-')
{
if(*str == '-')
{
flag = -1;
}
str++;
}
while(*str)
{
if((*str <= '9') && (*str >= '0'))
{
state = VALID;
ret = ret * 10 + flag * (*str - '0');
str++;
if(ret > INT_MAX) //上溢出
{
state = INVALID;
printf("上溢出,");
return (int)INT_MAX;
}
if(ret < INT_MIN) //下溢出
{
state = INVALID;
printf("下溢出,");
return (int)INT_MIN;
}
}
else //异常字符
{
return (int)ret;
}
}
return (int)ret;
}
int main()
{
int ret = My_Atoi("");
//int ret = My_Atoi("1213");
//int ret = My_Atoi("-1213");
//int ret = My_Atoi("123aaa");
//int ret = My_Atoi("-111111111111111");
//int ret = My_Atoi("111111111111111");
if(state == INVALID)
{
printf("输入非法!!\n");
}
printf("ret = %d\n", ret);
system("pause");
return 0;
}
部分测试结果:
/*My_Atoi("")*/
/*My_Atoi("-1213")*/
/*My_Atoi("111111111111111")*/
/*My_Atoi("123aaa")*/
在以后写一个库中已有的函数,先使用它,并测试它可以完成的事情,以及可以处理的异常,只要考虑到那些异常处理,那么这些函数就可以很轻松搞定。
转载于:https://blog.51cto.com/xujiafan/1757626