这个函数的功能是将字符串转换为整形,那么具体是怎么样的呢
先看几个例子:


因此,我们模拟实现时,要考虑以上几种非法输入情况:
1.空字符串
2.空白字符
3.处理+-号
4.过大值过小值
5.数字中间有其他字符
atoi模拟实现:
#include <stdio.h>
#include <ctype.h>
#include <assert.h>
#include <stdlib.h>
enum State
{
VALID,
INVALID
}sta = INVALID;//默认设置为非法
int my_atoi(const char* str)
{
//空指针
assert(str);
//空字符串
if (*str == '\0')
return 0;
//跳过空白字符
while (isspace(*str))
{
str++;
}
//处理+-
int flag = 1;
if (*str == '+')
{
flag = 1;
str++;
}
else if(*str == '-')
{
flag = -1;
str++;
}
long long r = 0;
while (*str)
{
if(isdigit(*str))
{
r = r * 10 + flag*((long long)*str - '0');
if (r > INT_MAX || r < INT_MIN)
{
if (flag == 1)
return INT_MAX;
else
return INT_MIN;
}
str++;
}
else
{
return (int)r;
}
}
sta = VALID;
return (int)r;
}
int main()
{
char arr[] = " 12ab34";//加几个空格
int ret = my_atoi(arr);
if (sta == VALID)
printf("合法的转换:%d\n", ret);
else
printf("非法的转换:%d\n", ret);
return 0;
}