模拟实现atoi,例如输入字符串“12345”,输出整数12345

我们需要考虑很多种情况,库里的atoi函数处理了各种情况,读者可以试着调用一下

1. ''12345".输出 12345                                    2."-12345'',输出 -12345

3."         12345",输出 12345                             4.考虑溢出的情况

5.遇到非法字符返回已计算到的值,程序结束。比如"a12345",输出0.  "12a345",输出12.   "12345a'',输出"12345"

根据以上分析,程序如下:


#include<stdio.h>
#include<iostream>
#include<assert.h>
#include<ctype.h>
#include<stdlib.h>

enum STATE
{
VALID, //合法
INVALID //非法
};

enum STATE state = INVALID;

int my_atoi(const char *str)
{
int flag = 1;
long long ret = 0;
//空指针
assert(str != NULL);
//空字符串的情况
if (*str == '\0')
{
return 0;
}
//处理空白字符
while (isspace(*str))
{
str++;
}
//处理+-号
if (*str == '+')
{
str++;
}
if (*str == '-')
{
str++;
flag = -flag;
}
while (*str)
{
if (isdigit(*str))
{
ret = ret * 10 + flag *(*str - '0');
//考虑溢出的情况
if ((ret > INT_MAX) || (ret<INT_MIN))
{
return (int)ret;
}
}
//非法字符
else
{
state = VALID;
return (int)ret;
}
str++;
}
state = VALID;
return (int)ret;
}

int main()
{
char *p = "-12345";
int ret = my_atoi(p);
if (state == VALID)
{
printf("%d\n", ret);
}
system("pause");
return 0;
}