实现atoi()函数开始以前,测试了库中的atoi()函数,发现库中提供的atoi函数能够处理许多异常,下面就是库中能够处理的异常:ide
1.指针为NULL
函数
2.空字符串
测试
3.(+,-)号处理spa
4.遇到异常字符时的处理方式
3d
5.溢出时处理,分为两部分:指针
1).上溢出,输出上界
blog
2).下溢出,输出下界
字符串
那么对这些异常进行处理就能够完成一个简单atoi()函数了。get
代码实现:
it
/*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")*/
在之后写一个库中已有的函数,先使用它,并测试它能够完成的事情,以及能够处理的异常,只要考虑到那些异常处理,那么这些函数就能够很轻松搞定。