功能
解析C字符串 将其内容解释为整数 该整数作为int类型返回
函数接收一个char*类型的指针 返回类型是int
举例
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
int main()
{
char* p = "58746";
int ret = atoi(p);
printf("%d", ret);
return 0;
}
可以看到,atoi函数将字符串内容转化为整型数据
注意事项
我们在实现atoi函数时要考虑几个问题
- 因为参数部分是一个指针类型 所以我们就需要考虑空指针的问题
- 还要考虑如果传入的字符串是空字符串时 该怎么办
- 如果字符串前面有空格等空白字符怎么解决
- 如果字符串前有+/-等符号怎么处理
- 如果字符串过长怎么解决
接下来我们就实现atoi
模拟实现atoi
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<ctype.h>
enum State
{
VALID,
INVALID
}state = INVALID;
int my_atoi(const char* p)
{
assert(p);
//断言指针的有效性 防止出现空指针
if (*p == '\0')
{
return 0;
}
//如果字符串第一个字符就是\0,说明是空白字符串
//直接返回0
//但是为了防止与可能出现的情况字符串“0”转化过来也是0二者冲突
//创建枚举类型来标注合法和非法 默认为非法
//所以这里直接返回0 返回的是非法0 可以通过if语句判断
while (isspace(*p))
{
p++;
}
//跳过空白字符
int flag = 1;
if (*p == '+')
{
p++;
}
else if (*p == '-')
{
flag = -1;
p++;
}
//判断正负数
//如果前面没有符号默认为正数
long long int ret = 0;
//创建long long 类型增加储存的长度
while (*p)
{
if (isdigit(*p))
{
ret = ret * 10 + flag * (*p - '0');
if (ret > INT_MAX)
{
return INT_MAX;
}
else if (ret < INT_MIN)
{
return INT_MIN;
}
//这里判断是否超过int类型的最大值或者最小值
//返回前没有改变state的合法性 所以默认都是非法返回值
}
else
{
return (int)ret;
//如果没有遇到字符串末尾就已经不是数字字符
//说明字符串非法 返回非法前的数字字符
}
p++;
}
state = VALID;//此时经过所有筛选 返回值合法 将状态修改为合法
return (int)ret;
}
int main()
{
printf("%d", my_atoi("1231#5646"));
return 0;
}