一、前言:
在模拟实现atoi函数前,我们要了解atoi的使用
atoi函数是将数字字符串转换为对应的数字,比如输入字符串“-123”,打印出整型数字-123
二、思路分析:
我们要思考传来的字符串是什么样子?(注意:我们主要实现一些常规得字符串,不要思考一些稀奇古怪的字符串形式,不然这个库函数的实现该没完没了了)
1.空字符串atoi("")
2.空指针atoi(NULL)
3.带有空格的数字字符串atoi(" 123")
4.字符串中不仅有数字还有字母atoi("123abc")
5.非常大的数字字符串(数字字符串超出整数的表示范围)atoi("11111111111111111111111111")
- 当传过来的参数是空字符串和空指针的时候我们应该返回什么呢,atoi的返回类型int类型,我们应该返回0吗?但是如果我们传过来的就是“0”呢,这时我们应该创建一个枚举类型
如果合法,我们就返回一个合法的0,如果不合法,我们就返回一个不合法的0,由于合法的传参是少数,不合法传参是多数,我们创建一个全局的枚举类型变量,将值置为不合法,当是合法的数时,我们再将它置为合法
- 处理数字字符:我们要将数字字符转换为数字,需要得到有正负的十进制数字,并且判断它的合法性
1.怎么样将数字字符转换为数字?
将数字字符-字符‘0’=数字
2.将数字转换为十进制数字
创建一个新的变量ret,让ret等于ret*10后再加上当前的数字
3.怎么得到正负?
再处理数字字符前,我们如果遇到'+',flag=1;,遇到‘-’,flag=-1; ,将flag乘到ret中
4.判断合法性
ret要用long long类型,atoi返回的是int类型,传来的数字必须是整型范围内的,此时的ret要能存放超出int类型的范围的数字,所以ret要用long long类型
三、具体实现:
enum Status
{
VALID,
INVALID,
};
enum Status status = INVALID;
int my_atoi(const char* str)
{
if (str == NULL)
{
return 0;
}
if (*str == '\0')
{
return 0;
}
//判断空白字符
while (isspace(*str))
{
str++;
}
//判断是正数还是负数
long long ret = 0;
int flag = 1;
if (*str == '+')
{
flag = 1;
str++;
}
else if (*str == '-')
{
flag = -1;
str++;
}
//处理数字字符
//判读是否是数字字符
while (isdigit(*str))
{
ret = ret * 10 + flag * (*str - '0');
//判断越界
if (ret<INT_MIN || ret>INT_MAX)
{
return 0;
}
str++;
}
if (*str == '\0')
{
status = VALID;
return (int)ret;
}
else
{
return (int)ret;
}
}
int main()
{
int ret = my_atoi("123");
if (status == INVALID)
{
printf("非法转换:%d\n", ret);
}
else
{
printf("合法转换:%d\n", ret);
}
}