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;
}
代码运行结果:>
123
3. atoi函数的模拟实现
int atoi (const char * str);
仿照原函数声明来写一个自己的atoi函数
- 判断传入的第一个字符是否为空白字符,如果是则跳过,直到找到第一个非空字符
- 判断是否有正负号,如果有则记录并跳过
- 判断是否为字符字母,如果为字符则返回0,
- 如果为字符数字,则将其到字母前的数转换为整型并返回
前三步很容易实现,只需用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 = 0while (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;
}
运行结果如下:>
123