目录
1. atoi函数
1.1 函数的声明
1.2 函数的作用
1.3 函数的使用
2. 模拟实现atoi函数
2.1 整理思路
2.2 整份代码
int atoi (const char * str);
int main() {
char arr[] = " 1234a000";
int i = atoi(arr);
printf("%d", i);
return 0;
}
int atoi (const char * str);
//空指针
assert(str);
//空字符串
if (*str == '\0')
return 0;
//跳过空白字符
//例如:“ 12345”,跳过前面的空格
while (isspace(*str)) {
str++;
}
//flag:+ - 来表示
int flag = 1;//1表示正号,-1表示负号
if (*str == '+') {
flag = 1;
str++;
}
else if (*str == '-') {
flag = -1;
str++;
}
//为了方便
long long r = 0;//因为r可能会超过INT_MAX或者低于INT_MIN,所以要想将r设置为long long类型
while (*str) {
//判断是否为数字字符
if (isdigit(*str)) {
//数字字符在字符表中都是按顺序排放的,所以‘1’-‘0’= 1
//r * 10是为了保证前一位能进一位,例如字符串“12”,为了保证1到十位,所以要乘以10
r = r * 10 + flag * (*str - '0');
if (r > INT_MAX || r < INT_MIN) {
if (flag == 1)//判断正负号
return INT_MAX;
else
return INT_MIN;
}
str++;
}
else {
return (int)r;
}
}
enum State
{
VALID,//0
INVALID//1
}sta = INVALID;//默认设置为非法
enum State
{
VALID,//0
INVALID//1
}sta = INVALID;//默认设置为非法
int my_atoi(const char* str) {
//空指针
assert(str);
//空字符串
if (*str == '\0')
return 0;
//跳过空白字符
//例如:“ 12345”,跳过前面的空格
while (isspace(*str)) {
str++;
}
//flag:+ - 来表示
int flag = 1;//1表示正号,-1表示负号
if (*str == '+') {
flag = 1;
str++;
}
else if (*str == '-') {
flag = -1;
str++;
}
//为了方便
long long r = 0;//因为r可能会超过INT_MAX或者低于INT_MIN,所以要想将r设置为long long类型
while (*str) {
//判断是否为数字字符
if (isdigit(*str)) {
//数字字符在字符表中都是按顺序排放的,所以‘1’-‘0’= 1
//r * 10是为了保证前一位能进一位,例如字符串“12”,为了保证1到十位,所以要乘以10
r = r * 10 + flag * (*str - '0');
if (r > INT_MAX || r < INT_MIN) {
if (flag == 1)//判断正负号
return INT_MAX;
else
return INT_MIN;
}
str++;
}
else {
return (int)r;
}
}
sta = VALID;
return (int)r;
}
int main() {
char arr[] = " 1234a0000000000000000000000";
int ret = my_atoi(arr);
if (sta == VALID)
printf("合法的转换:%d\n", ret);
else
printf("非法的转换:%d\n", ret);
}