函数说明:
库内自带函数,需要引用头文件#include<stdlib.h>
将字符串123转换成整型数字123(一百二十三)
特点:
- 输入123输出->123 //直接转换
- 输入123.5输出->123 //int类型转换(也可以理解为直接把.看作字符处理)
- 输入-123输出->-123 //需识别字符‘-’,转换成-(负号)
- 输入+123输出->123
- 输入 (空格)123输出->123 //如有空格,直接前移覆盖空格
- 输入12 (空格)3输出->12 //后面有空格就已停止,无法继续识别
- 输入-+123输出->0 //针对两个及以上+-符号无法识别
- 输入--123输出->0
- 输入123abcd123输出->123
- 输入123--++123输出->123
思想(分布求解):
1,输入123输出->123
1,得到字符个数以及单个字符转换为数字对应位数上的数字
字符个数与数字位数关系:1234 -4个字符-4是千位10的3次方
得到字符个数的方法:判断字符在’0’,’9’之间,定义count进行累加和
数字的位数即为10的count-1次方
2,实现单个字符的转换:
通过ASCCI码‘1’-‘0’=1;
eg: 0:ASCCI 48 1:ASCCI 49
部分代码实现:
int GetBite(char* arr, int length)
{
int count = 0;
int len;
for (int i = 0; i < len; i++)
{
if (arr[i] >= '0' && arr[i] <= '9')
{
count++;
}
}
return count;
}
int my_atoi(char* arr, int len)
{
assert(arr != NULL);
int result = 0;
int bite = GetBite(arr, len);
for (int i = 0; i < len; i++)
{
result = (arr[i] - '0') * pow(10, bite - 1); //代码解释①
}
return result;
}
①result=(arr[i]-'0')*pow(10,bite-1);
pow(10,bite-1): pow函数是实现10的bite-1次方
arr[i]-'0':将字符转换为数字
2,输入123.5输出->123 //int类型转换(也可以理解为直接把.看作字符处理)
修改代码:
result = (arr[i] - '0') * pow(10, bite - 1);//代码解释②
②(int):进行类型强制转换,result为int类型,pow为double类型,int*double=double,需要强转
3,输入-123输出->-123 //需识别字符‘-’,转换成-(负号)
修改代码:
int flag = 1;//存储正负号
for (int i = 0; i < len; i++) //将整数变成正负数
{
if (arr[i] == '-')
flag = -1;
else //加else的目的:如果不加else,-'-'-'0'不是字符,执行错误
result = (int)(result + (arr[i] - '0') * poe(10, bite - 1));
}
4,输入+123输出->123
修改代码:
int flag = 1;//存储正负号
for (int i = 0; i < len; i++) //将整数变成正负数
{
if (arr[i] == '-')
flag = -1;
else if (str[i] == '+') {
continue;// 结束当前循环,进行新一轮循环
else //加else的目的:如果不加else,-'-'-'0'不是字符,执行错误
result = (int)(result + (arr[i] - '0') * poe(10, bite - 1));
}
5,输入 (空格)123输出->123 //如有空格,直接前移覆盖空格
修改代码:
while (arr[i] == ' ')//(*arr)
arr[i] = arr[i++];//arr++;
6,输入12 (空格)3输出->12 //后面有空格就已停止,无法继续识别
修改代码:
GetBite函数内:
for (int i = 0; i < len; i++)
{
if (arr[i] >= '0' && arr[i] <= '9')
{
count++;
}
else
break; //遇到空格直接返回
}
7,输入 - +123输出->0 //针对两个及以上+-符号无法识别
8,输入--123输出->0
//(7)(8)同理,代码如下:
GetBite函数内:
//用num来控制+-个数
int num = 0;
for (int i = 0; i < len; i++)
{
if (arr[i] >= '0' && arr[i] <= '9')
{
count++;
if (num >= 2)//如果出现两个及以上+-结果为0
return 0;
}
else if (arr[i] == '+' || arr[i] == '-') //得到+-的个数
num++;
else
break; //遇到空格直接返回
}
9,输入123abcd123输出->123
10,输入123--++123输出->123
//与(6)同理
综合整理代码如下:
#define _CRT_SECURE_NO_WARNINGS //VS编译器下需要
#include<assert.h> //断言
#include<stdio.h>
#include<string.h>
#include<stdlib.h> // atoi itoa
#include<math.h> //pow函数
int GetBite(char* arr, int length)
{
int count = 0, num = 0;
int len = strlen(str);
//删除空格
for (int i = 0; i < len; i++)
{
if (arr[i] >= '0' && arr[i] <= '9')
{
count++;
if (num >= 2)//如果出现两个及以上+-结果为0
return 0;
}
else if (arr[i] == '+' || arr[i] == '-') //得到+-的个数
num++;
else
break;
}
return count;
}
int my_atoi(char* arr, int len)
{
assert(arr != NULL);
int result = 0;
int flag = 1;//存储正负号
int i = 0;
while (arr[i] == ' ')//(*arr)
arr[i] = arr[i++];//arr++;
int bite = GetBite(arr, len);
int len = strlen(arr);//重新求长度
for (int i = 0; i < len; i++) //将整数变成正负数
{
if (arr[i] == '-')
flag = -1;
else if (arr[i] == '+')
continue;//结束了当前循环
else //加else的目的:负数-'0'不是字符,执行错误
result = (int)(result + (arr[i] - '0') * pow(10, bite - 1));
}
return result * flag;
}
int main()
{
char arr[] = "123";
int length = sizeof(arr) / sizeof(arr[0]);
printf("%d", my_atoi(arr, length));
return 0;
}
如有错误麻烦评论区告诉我 谢谢❤