模拟术语讲解
- 首先,需要定义一个标志位变量sign,用于表示转换结果的合法性1。
- 定义一个函数My_atoi,用于实现atoi的功能1。
- 在My_atoi函数中,首先遍历字符串,直到遇到第一个非空格字符1。
- 如果第一个字符不是数字或正负号,直接返回01。
- 如果第一个字符是负号,则判断是否为负数,如果是,将符号位flag设置为-1,并移动到下一个字符1。
- 如果符号位后面紧跟数字,进行数字转换1。
- 将转换后的数字乘以符号位1。
- 检查转换后的数字是否在INT_MIN和INT_MAX之间1。
- 在主函数中,定义一个字符数组arr,存储待转换的字符串1。
- 调用My_atoi函数进行转换1。
- 根据转换结果的符号位,判断转换是否合法1
——————————————————————————————————————————————————————————————————————————————————————
图解说明
这里也就是正负数会打印出来
也就是
1加减会影响数字的正负
2 再这个字符串里面 如果出现非数字字符 也就是会停止转化
3,只会过滤开始的 空格 中间遇见任何不是数值的东西 都会直接结束循环
4 如果转换之后的数字大于最大值那么按照最大值算,如果比最小值还小 那么按照最小值计算
进行参数的判断
作用 判断传进来的是不是空格
头文件
判断是不是空格
因为这里的逻辑是 刚开始的时候 从空格外进行计算
这里判断是不是空格的函数 空格就进行++
判断正负数
细致进行判断
假设是
123a
只要遇见的不是‘\0’就继续进行循环
内部进行计算
这个是isdigit进行函数判断 也就是 判断是不是数字字符
是就返回不是0
flg是正负数
else
强制类型转化
完善
if大于最大值 小于最小值
这里给一个限制 超出就返回最大或者最小值
这里进行解释 是因为返回的是一个整数
也就是 返回的是一个整体 不是一个一个
如果是123的时候
此时也就是
0*10+1=1
1*10+2=12
12*10+3=123
所以返回的是一个整体的数字 而不是分开的
枚举的使用
利用枚举进行判断是不是合法转化
这里可以使用枚举 进行一个判断
也就是
——————————————————————————————————————————————————————————————————————————————————————
知识点补充
对于类型取值学习不理解的,可以看看这一篇文章。类型在内存中的存储范围-CSDN博客https://blog.csdn.net/Jason_from_China/article/details/137104093
——————————————————————————————————————————————————————————————————————————————————————
代码详解
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
#include<limits.h>//INT_MAX的头文件
#include<ctype.h>//isspace判断是不是空格 只要是就继续循环
//atio的逻辑是把字符串转化成数字
//1,开始在遇见第一个数字字符之间只要是空格会一直继续往后计算
//2,在遇见第一个数字字符之后,只要不是数字字符会直接返回
//
//也就是
//1加减会影响数字的正负
//2 再这个字符串里面 如果出现非数字字符 也就是会停止转化
//3,只会过滤开始的 空格 中间遇见任何不是数值的东西 都会直接结束循环
//4 如果转换之后的数字大于最大值那么按照最大值算,如果比最小值还小 那么按照最小值计算
//
int MY_atoi(const char* str)
{
//进行一个断言防止空字符
assert(str != NULL);
//进行一个长度返回
if (*str == '\0')
{
return 0;
}
//循环排除空格 " 123s4 5 w"
while (isspace(*str))//这里解应用元素++
{
str++;
}
//这里进行判断正负号 。不显示的话默认也就是+" 123s4 5 w"
int flg = 1;
if (*str == '+')
{
flg = 1;
str++;
}
else if (*str == '-')
{
flg = -1;
str++;
}
//遇见数字字符,但是这里是一直循环之前是不遇见最后一个字符串0的 那就是循环没有结束
long long ret = 0;// 这里采取一个比较大的类型进行接收,因为实际操作的时候可能数值会很大
while (*str != '\0')
{
if (isdigit(*str))//此时到这里就已经是"123s4 5 w",这里是判断当前是字符是不是空字符 不是就继续运行
{
ret = ret * 10 + (*str - '0') * flg;
//补充知识说明 因为整数在计算的时候是有一个区间范围的 整数的区间 我们在csdn引入的博客里面进行了讲解
if (ret > INT_MAX)
{
ret = INT_MAX;
}
if (ret < INT_MIN)
{
ret = INT_MIN;
}
}
else
{
//这里一旦遇见不是数字字符的情况,就会返回,因为这里是把++放到了最后,所以每次计算的时候已经
//把字符转化成一个整数了,也就是返回的时候返回的是一个数值,再进行强制转化
//因为我们给的是long long类型的(防止数值过大无法接收)
return (int)ret;
}
str++;//这里吧++ 放到最后 把计算放到if里面 并且这里是地址++ 不是元素++ 所以不需要解应用
}
//
//
return (int)ret;
}
int main()
{
char arr[] = " 123s45 w";
int ret = MY_atoi(arr);
printf("%d ", ret);
return 0;
}