目录
模拟实现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()函数本身会把空格跳过去。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int ret = atoi(" 123");
printf("%d\n", ret);
return 0;
}//123
一般不会考虑字符串中间有空格的问题。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int ret = atoi("12 3");
printf("%d\n", ret);
return 0;
}//12
即atoi()函数本身是不会处理这种空白字符的。
my_atoi()函数处理字符串的内容:是转换字符串的内容出来一个整数而不是改变这个字符串,所以加const修饰保护:const char* str,说明指针str指向的内容是不会修改的。
空字符串是没法转换的,是异常情况;若让空字符串返回0,但若是字符串"0"它返回的也是0,这是正常情况,这两种情况形成歧义。则需要区分这两种情况,my_atoi()函数就需要有正常情况和判断异常情况的状态。
注意:函数的功能尽可能的单一纯粹,如my_atoi()函数进行转换就可,不在这个函数中打印各种状态。
所以创建一个结构体类型表示状态。
#include <stdio.h>
#include <assert.h>
#include <ctype.h>
#include <stdlib.h>
enum State
{
INVALID,//非法
VALID//合法
};
//用这个结构体类型定义一个全局变量,这个变量用来表示状态
//因为异常情况较多,正常情