C语言之atoi函数的使用和模拟实现
1. atoi函数介绍
函数声明如下:
int atoi (const char * str);
atoi是用来将字符串中第一次出现的数字字符,转为一个整数
- 跳过空白字符,(空白字符包括:空格 ’ ’ ,换页 ’ \f ’ ,换行 ’ \n ’ ,回车’ \r ’ ,制表符 ’ \t ’ 以及 垂直制表符 ’ \v’ ),直到找到一个非空字符
- 第一次出现非空字符,如果为字符,则返回值为0,如果为数字,则将这一串数字以整型返回,并且判断是否有正负字符
2. atoi函数的使用
#include <stdio.h>
#include <stdlib.h> //使用atoi函数需包含的头文件
int main()
{
char arr[] = " \n \t 123abcde123";
int ret = atoi(arr);
printf("%d", ret);
return 0;
}
3. atoi函数的模拟实现
int atoi (const char * str);
仿照原函数声明来写一个自己的atoi函数
前三步很容易实现,只需用if来判断即可
重要的是如何将字符数字转换为整数
1ab2 其中只有一个数字,字符数字减去字符0 即 **‘0’**既可以得到整型数字,直接将这个值返回就可以了
12ab12 其中有两个数字,字符1减去字符0,得到1,此时要将1移动到十位,也就是乘以10,得到10,再加上字符2减去字符0,得到12并返回
123ab123 其中有三个数字,字符1减去字符0,得到1,此时要将1移动到十位,也就是乘以10,得到10,再加上字符2减去字符0,得到12,将1移动到百位,再乘以10,得到120,再加上字符3减去字符0,得到123并返回
也就是说一次计算一个字符数字,先将其转化为整型数字,下一次乘以10再加上转化的整型数字就可以
代码实现如下:
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <ctype.h>
int my_atoi(const char* str)
{
assert(str); //assert断言 判断是否为空指针
int num = 0; //记录转换之后的值
int sign = 1; //假设为整数,如果下面判断中出现负号,则sign = 0
while (isspace(*str)) //isspace判断是否为空白字符,如果是则为真,不是则为假
{
str++; //跳过空白字符
}
if (isalpha(*str)) //判断是否为字母,为字母则返回0
{
return 0;
}
else
{
if (*str == '-') //判断正负号
{
sign = -1;
str++; //跳过负号
}
while (isdigit(*str)) //isdigit判断是否为数字
{
num = num * 10 + *str - '0'; //将字符数字转为整型数字并相加
str++; //找到下一个字符
}
return num * sign; //将记录的值 乘以 正/负号 并返回
}
}
int main()
{
char arr[] = " \n \t \n 123aweasda a";
printf("%d", my_atoi(arr) );
return 0;
}