模拟实现 Atoi
分析思路:
首先先判断是否为空指针
接着我们来引入一个新的库函数isspace它是来解决前面有多少空格的问题,接着是处理正负号的问题,如果指针检测到前面有—,那么就令flg=-1,
我们又要引入一个新的库函数isdight 来判断前面是否有数字,
我们还定义了一个全局变量,叫state,是为了判断是否运算出现了问题
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<string.h>
#include <stdlib.h>
#include <assert.h>
#include <ctype.h>
int state = 0;
int MyAtoi(const char* str)
{
assert(str != NULL);
if (*str == '\0')
{
return 0;
}
//处理空格问题
while (isspace(*str))
{
str++;
}
//处理正负号的问题
int flg = 1;
if (*str == '-')
{
flg = -1;
str++;
}// + 没有+号是不加的
else if(*str == '+')
{
flg = 1;
str++;
}
else
{
flg = 1;
}
//开始进行转换了
long long ret = 0;//是因为如果要计算的数很大,int类型是完全不够的
while (*str != '\0')
{
//isdigit 判断当前字符是否是数字字符 ‘1’ ‘2’ ‘3’ '4'
if (isdigit(*str))
{
// 0 * 10 + ('1' - '0') * -1 -> -1
// -1 * 10 + ('2' - '0') * -1 ->-12
// -12 * 10 + ('3' - '0') * -1 -> -123
ret = ret * 10 + (*str - '0') * flg;
if (ret >= INT_MAX)
{
return INT_MAX;
}
if (ret <= INT_MIN)
{
return INT_MIN;
}
}
else
{
return (int)ret;
}
str++;
}
if (*str == '\0')
{
state = 1;
}
return (int)ret;
}
int main()
{
int ret = MyAtoi("123a456");//"-123a456"
if (state == 1)
{
printf("正常数字的转化: %d\n",ret);
}
else
{
printf("非正常数字的转化: %d\n", ret);
}
return 0;
}