什么是atoi函数?
把字符串转换成整型数的一个函数。
那现在我们来实现如何构造出这个函数
1.首先创建出主函数和自定义函数
int main()
{
char ch[] ="1234";
return 0;
}
我们如何去实现将字符串1234转换成整形呢?
我们这里引入了一个my_atoi的自定义函数。
并且为了对于ch数组和数组指针加上const使代码更为健壮。
int my_atoi(const char* s)
{
}
int main()
{
const char* p = "1234";
int ret = my_atoi(p);
return 0;
}
2. 那接下来我们要在my_atoi函数中写什么呢?
2.1 我们要进行对传入来的字符串的判断。
(1)是否传来的字符串为空字符串?
(2)是否传来的为空指针?
(3)传来的字符串是否只有数字字符?
(4)对于转换数字的正负判断
对于这类问题我们要一一讨论
因此我们的my_atoi函数可以添加如下内容
int my_atoi(const char* s)
{
int flag;
//assert(s != NULL);
if (s == NULL)
return 0;
if (*s == '\0')
return 0;
//跳过空白字符
while (isspace(*s))//是空白字符返回非0值 非空白字符不进入
{
s++;
}
//处理+-
if (*s == '+')
{
flag = 1;
s++;
}
else if (*s == '-')
{
flag = -1;
s++;
}
}
2.2 那我们是如何判断接下来的字符都是数字字符呢?
我们引入了一个新的函数 - isdigit,通过此函数可以判断是否为数字字符,那接下来我们就要进行如何将一个数字字符转换称一个十进制数字。
那写到了这里我们已经斩断了几乎所有的困难,那接下来我们需要写出我们的主要步骤 - 把字符串转换成数字。
2.3 如何把数字字符转换称数字
首先我们可以通过观看ASCII表可以看出字符1-9与数字1-9的关系
可以得知当'9'-'0'=9、'8'-'0'=8,可以推出数字字符等于数字加上'0'的ASCII。
因此我们的代码可以如下图所示
while (isdigit(*s))
{
n = n * 10 + (*s - '0') * flag;
if (n > INT_MAX || n < INT_MIN)
{
return 0;
}
s++;
}
我们的基本代码就写出来了,但如果考虑数字字符以后有着其他字符呢?
我们可以引入一个全局变量来定义是否合法转化
enum state
{
INVALID, //0
VALID //1
};
enum state STATE = INVALID;//记录是合法访问的值还是非法访问的值
然后对数字字符后位进行判断
//非数字字符或\0
if (*s == '\0')
{
STATE = VALID;
return n;
}
else//非数字字符
{
STATE = INVALID;
return n;
}
}
通过对后位的判断来决定是否为合法转化。
最后请看整理出的代码:
enum state
{
INVALID, //0
VALID //1
};
enum state STATE = INVALID;//记录是合法访问的值还是非法访问的值
int my_atoi(const char* s)
{
int flag;
//assert(s != NULL);
if (s == NULL)
return 0;
if (*s == '\0')
return 0;
//跳过空白字符
while (isspace(*s))//是空白字符返回非0值 非空白字符不进入
{
s++;
}
//处理+-
if (*s == '+')
{
flag = 1;
s++;
}
else if (*s == '-')
{
flag = -1;
s++;
}
//处理数字字符的转换
long long n = 0;
while (isdigit(*s))
{
n = n * 10 + (*s - '0') * flag;
if (n > INT_MAX || n < INT_MIN)
{
return 0;
}
s++;
}
//非数字字符或\0
if (*s == '\0')
{
STATE = VALID;
return intn;
}
else//非数字字符
{
STATE = INVALID;
return intn;
}
}
#include<string.h>
int main()
{
const char* p = "1234";
int ret = my_atoi(p);
if (STATE == VALID)
printf("合法的转换:%d", ret);
else
printf("非法的转换:%d", ret);
return 0;
}
谢谢观看!