首先我们得知道字符串转为整数的核心算法,我们以“12345”为例
核心算法:
int sum=0;
sum=sum*10+str-'0';
str为1时,sum=0*10+1-‘0’=1;
str为2时,sum=1*10+2-‘0’=12;
str为3时,sum=12*10+3-‘0’=123;
str为3时,sum=123*10+4-‘0’=1234;
str为4时,sum=1234*10+5-‘0’=12345;
其中减0是将字符值转化成整数值(1+‘0’=‘1’)
下面是这道题的分析:
题目要求是一串字符串,所以我们需要对这一串字符串进行合法判断:
“”(空字符串)、NULL(空指针)、越界、“+、-、‘ ’ 字符”等字符
如果是非法字符,我们需要进行处理!!!
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <ctype.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++;
else if (*str == '-')
{
flag = -1;
str++;
}
//处理正常数字
while (*str)
{
//合法数字
if (isdigit(*str))
{
ret = ret * 10 + (*str - '0')*flag;
str++;
if (ret > INT_MAX || ret < INT_MIN)
return 0;
}
//非法不是数字,返回之前算出的ret值
else
return (int)ret;
}
//整个字符串判断合法
state = VALID;
return (int)ret;
}
int main()
{
char *p = "5567";
int ret = my_atoi(p);
if (state == VALID)
{
printf("合法:%d\n", ret);
}
else if (state == INVALID)
{
printf("非法:%d\n", ret);
}
system("pause");
return 0;
}