各位CSDN的uu们你们好呀,今天,小雅兰来为大家分享一个函数的模拟实现,这是一个比较有意思的东西,下面,让我们进入atoi的世界吧
可知:atoi的功能是把一个字符串转化成整数
剑指offer上出现过这样一个场面:
实质上这个代码案例,就是讲的atoi的模拟实现
为了不像上述面试案例的这位程序员一样:我们首先来看看,模拟实现atoi的注意事项
- 空指针问题
- 空字符串问题
- +和-问题
- 非数字字符问题
- 越界问题
为了解决空指针问题,首先想到的是当然是断言啦!!!
//解决空指针问题 assert(str);
解决空字符串问题:
//解决空字符串问题 if (*str == '\0') { return 0; }
解决+和-的问题:
//解决+ —号的问题 if (*str == '+') { flag = 1; str++; } else if(*str=='-') { flag = -1; str++; }
解决越界的问题:
long long ret = 0;//解决越界的问题
解决非数字字符的问题:
while (*str) { if (isdigit(*str)) { ret = ret * 10 + flag * (*str - '0'); if (ret > INT_MAX || ret < INT_MIN) { return 0; } } else { return (int)ret; } str++; }
模拟实现atoi源代码如下:
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<assert.h> #include<limits.h> #include<ctype.h> enum State { VALID, INVALID }; enum State s = INVALID;//非法的状态 //模拟实现atoi //空指针 //空字符串 // + - //非数字字符 //越界 int my_atoi(const char* str) { //解决空指针问题 assert(str); int flag = 0; //解决空字符串问题 if (*str == '\0') { return 0; } //解决+ —号的问题 if (*str == '+') { flag = 1; str++; } else if(*str=='-') { flag = -1; str++; } long long ret = 0;//解决越界的问题 while (*str) { if (isdigit(*str)) { ret = ret * 10 + flag * (*str - '0'); if (ret > INT_MAX || ret < INT_MIN) { return 0; } } else { return (int)ret; } str++; } if (*str == '\0') { s = VALID; } return (int)ret; } int main() { int ret = my_atoi("-1234567890"); if (s == INVALID) { printf("非法转换\n"); printf("%d\n", ret); } else { printf("合法转换\n"); printf("%d\n", ret); } return 0; }
好啦,小雅兰今天的模拟实现atoi就到这里啦,继续加油!!!