1.
代码:
//1. 空指针
//2. 空字符串
//3. 空白字符
//4. + -
//5. 非数字字符
//6. 超大数字
//
//
#include<LIMITS.H>
#include <ctype.h>
#include<assert.h>
//#include<stdlib.h>
enum State
{
INVALID,//非法
VALID //合法
};
//合法情况只有一种,二非法情况有很多,所以我们先默认初始化设置为非法。
enum State status = INVALID;
int my_atoi(const char* str)
{
//空指针
assert(str);
//空字符串
if (*str == '\0')
return 0;
//空白字符(跳过)
while (isspace(*str))
{
str++;
}
//正负数,用一个标记,先默认是正数 标记1,负数标记-1
int flag = 1;
//+-
if (*str == '+')
{
str++;
flag = 1;
}
else if (*str == '-')
{
str++;
flag = -1;
}
//防止大数值,判断是否超出整形的范围,这里定义在int ,是无法判断的。
long long n = 0;
while (isdigit(*str))
{
//转换
n = n * 10 + flag*(*str - '0');
//越界的值
if (n > INT_MAX || n < INT_MIN)
{
return 0;
}
str++;
}
_CRT_INT_MAX;
if (*str == '\0')
{
//合法返回
status = VALID;
return (int)n;
}
//走到这里返回,那就不是正确返回,正确返回只有一种,默认status状态也是INVALID;
return (int)n;
}
2.测试