目录
模拟实现atoi
int atoi( const char *string );
atoi的功能:把一个字符串转换为对应的整形。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int ret = atoi("123");
printf("%d\n", ret);
return 0;
}//123,由字符123\0得到数字123
简单思路:
举例字符串"123"
1. 得到一百二十三的每个数字:遍历字符串:"123\0",因为如果是字符1,"1"-"0"=1,即字符1-字符0=数字1,所以:
"1"-"0"=1
"2"-"0"=2
"3"-"0"=3
2. 得到数字一百二十三:让n从0开始:n=0
n=n*10+1得到1
n=n*10+2得到12
n=n*10+3得到123
代码实现:
#include <stdio.h>
int my_atoi(char* str)
{
int n = 0;
while (*str)//\0的ACSII码值为0,停下
{
//*str是字符1
n = n * 10 + (*str - '0');
str++;
}
return n;
}
int main()
{
int ret = my_atoi("123");
printf("%d\n", ret);//传的是首字符地址
return 0;
}//123
上述是正常情况,只有一种,字符串处理到\0就结束正常转换为一个数字。
全面考虑——异常情况有:
1. 处理空指针:
若传的字符串为NULL,就不能对其解引用——需要断言
2. 处理空字符串
若传的是空字符串,不进入循环,返回n为0的值,那么返回的这个0是数字0还是空字符串0,形成歧义
3. 空白字符(字符串中有空格)
4. 正负数的问题
5. 字符串中有非数字字符,如"123abc"
6. 超大数字问题,如11111111111111111111111,一个整形是放不下的
注意:空白字符的情况:当字符串的前面有空格时,atoi()函数本身会把空格跳过去。