1.atoi函数的功能
我们能由图得知atoi的参数为一个字符串的地址,返回值为int;实际上atoi的函数功能就是将数字字符串转换为整数。下面就让给我们看看具体是怎么实现的。
atoi函数所使用的头文件是:#include <stdlib.h>
atoi函数使用案例:
如图我们看到atoi函数将字符串"123"转换成了数字123;那么若是数字前有符号的情况下怎么转换呢?我们接着看下一个例子
由此我们可以看出atoi函数是能够识别字符数字的正负从而转换。那么atoi函数遇到空格或者字母会发生什么呢?我们接着往下看。
由上述例子中我们可以得到下面几个结论:
1.atoi函数能够忽略字符串中一开始遇到的空格;
2.atoi函数如果先遇到字母字符就会返回0;
3.atoi函数一旦识别到数字后若遇到非数字就会直接返回;
2.atoi函数的模拟实现
对于atoi函数的模拟实现有这6个问题需要解决:
1.若函数传入的参数为空指针
2.若需要转换的字符串为空字符串""
3.如何忽略空格
4.如何确定正负
5.如何实现遇到数字字符转换成整型数字,遇到非数字字符返回
6.溢出问题(若该数字字符转换后大于INT_MAX或者T_MIN)
解决办法:
1.空指针的问题可以用assert函数断言即可;使用assert函数需要包含#include <assert.h>
2.空字符串的第一个函数为'\0',所以只需要判断字符串第一个函数是否为'\0'返回即可
这里存在非法转换和合法转换,遇到字符串末尾为合法转换;非法转换很多,例如遇到字母字符;可以使用枚举解决,创建一个枚举类型初始化为非法,因为非法情况比较多,而合法情况就一种
3.忽略空格即要跳过所有空格,我们需要用到isspace函数,这里简单介绍一下该函数
该函数使用来判断是否为空格,该函数参数若为空格则返回非0,参数若为非空格则返回0;所以我们用一个while循环并使用该函数就能轻松解决第三个问题;使用isspace函数需要包含
#include <ctype.h>
4.我们定义一个flag变量,若遇到'+'为1,遇到'-'为-1
5.第5个问题我们需要用到isdigit函数,同样这里简单介绍一下该函数
该函数用来判断是否是数字字符,若是数字字符'0'到'9'返回非0,若不是数字字符返回0;使用isdigit函数需要包含#include <ctype.h>
当是数字字符时,将其减去'0'即转换为数字,再继续判断下个字符,若是非数字字符则直接返回
6.当所得值大于最大整型或者小于最小整型时,就返回最大整型或者最小整型。
话不多说,具体代码实现如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>
#include <ctype.h>
#include <limits.h>
enum State
{
VAILD,//合法的
INVAILD//非法的
}state = INVAILD;
int my_atoi(const char*str)
{
assert(str);//防止str为空指针
if (*str == '\0')//遇到空指针直接返回0
{
return 0;
}
while (isspace(*str))//若跳过字符串开始可能出现的空格
{
str++;
}
int flag = 1;
if (*str == '-')//如果出现符号位-,则flag为-1;
{
flag = -1;
str++;
}
else if (*str == '+')
{
flag = 1;
str++;
}
long long ret = 0;
while (*str != '\0')//遇到数字字符转换成整型数字,遇到非数字字符返回
{
if (isdigit(*str))
{
ret = 10 * ret + (*str - '0') * flag;
if (ret >= INT_MAX)
{
ret = INT_MAX;
break;
}
else if (ret <= INT_MIN)
{
ret = INT_MIN;
break;
}
}
else
{
return (int)ret;
}
str++;
}
if (*str == '\0')
{
state = VAILD;
}
return (int)ret;
}
int main()
{
int ret = my_atoi("2111111111111111");
if (state == VAILD)
{
printf("合法转换");
}
else
{
printf("非法转换");
}
printf("%d", ret);
return 0;
}
码字不易,期待你的点赞,评论和收藏!