今天我们来认识一个函数,叫atoi,我们开始研究它吧!
1.认识atoi
1.函数功能:将字符串转换为整数
只能将整数字符串转换为整数,不能转换字符字符串
2.头文件:#include<stdlib.h>
3.使用格式:int atoi(const char* str);
4.返回值:
转换成功:返回整数值
转换失败:返回0
在字符串溢出的情况下,转换值是未定义的
(我们在下面代码示例中可以尝试一下,这里先告诉大家结果,方便总结)
待转换字符串超出正向最大范围,返回INT_MAX值(>INT_MAX)
待转换字符串超出反向最大返回,返回INT_MIN值 (<INT_MAX)
2.代码示例
int main() { int ret1 = atoi("-1234");//正常数 printf("%d\n", ret1); int ret2 = atoi("-111111111111111111111111111111111111"); printf("%d\n", ret2); int ret3 = atoi("22222222222222222222222222222222"); printf("%d\n", ret3); return 0; }
运行结果:
这里可以看到
待转换字符串超出正向最大范围,返回INT_MAX值(>INT_MAX)
待转换字符串超出反向最大返回,返回INT_MIN值 (<INT_MAX)
3.atoi的模拟实现
关于atoi的模拟实现,还是有很多细节的
1.空指针不可转换
2.空白字符串不可转换
3.空格等其他特殊符号不可转换
4.注意符号问题“+ -”
5.字符串溢出问题
注意到这些,我们开始实现函数:
//atoi 的模拟实现 //atoi状态的判断 enum State { VAILD, INVAILD }Sta = INVAILD;//创造变量默认为非法 int my_atoi(const char* str) { //判断是否为空指针 assert(str); //判断是否为空白字符串 if (*str == '\0') { return 0; } //判断是否为整数0~9 while (isspace(*str)) { str++; } //判断+ -号 int flag = 1; if (*str == '+') { flag = 1; str++; } else if (*str == '-') { flag = -1; str++; } //判断是否溢出 long long ret = 0; while (*str != '\0') { if (isdigit(*str)) { ret = ret * 10 + flag * (*str - '0');//减去字符0,才是数字0 if (ret > INT_MAX || ret < INT_MIN) { return 0; } } else { return (int)ret;//强制类型转化为int(函数的返回值是int) } str++; } if (*str == '\0') { Sta = VAILD; //正常转换完了,到末尾的 \0 } return (int)ret; } int main() { char arr[20] = "1234"; int ret = my_atoi(arr); if (Sta == VAILD) { printf("合法转换:%d\n", ret); } else if (Sta == INVAILD) { printf("非法转换:%d\n", ret); } return 0; }
运行结果:
这就是我们的atoi函数了,还有别的模拟实现方法,大家可以自己实现一个,咱们下期再见!!!