1.头文件
atoi() 是 C语言的一个标准库函数,定义在<stdlib.h>头文件中
2.atoi的解析
具体来讲,atoi() 函数首先会丢弃尽可能多的空白字符,直至找到第一个非空白字符,然后从该字符开始,识别 “+”、“-” 以及 0-9 之间的十进制数,最后将它们转换成整数。如果构成整数的后面还有其它字符,这些字符将会被忽略。
3.函数申明
参数
string:指向要转换的字符串。
如果由于 str 为空或者 str 字符串无法转换为整数,函数返回 0。
如果字符串表示的值超出了 int 类型所能表示的整数范围,函数返回的数值是int 最大值或最小值。
4.一些转化的例子
1.如果前面有+,转化后+号去掉
2.如果是-号,则保留
3.传入的是空指针
- 有空格的话跳过
5.空字符串的转化
6.大于int类型最大值,转化为int类型的最大值
7.小于int类型最小值,转化为int类型的最小值
8.出现整数后面有其他字符截断.
9.先出现其他字符比如a
5.函数实现
1.基本框架
enum State//枚举类型定义转化是否正常 { INVALID,//不正常 VALID,//正常 }sta= INVALID;//先让其正常 int my_atoi(const char *str)//atoi的具体实现 { } int main() { char arr[] = "1234"; int ret = my_atoi(arr);//返回转化后的值 if (sta == INVALID)//不正常转化 { printf("非正常转化-%d",ret); } if (sta == VALID)//正常转化 {printf("正常转化-%d", ret); } }
2.处理空指针
int my_atoi(const char *str)//atoi的具体实现 {assert(*str);//处理空指针 }
3.处理空字符串
int my_atoi(const char *str) { assert(*str); if (*str == '\0')//处理空字符串 { //处理空字符串 return 0; //处理空字符串 } }
4.处理空格
int my_atoi(const char *str) { assert(*str); if (*str == '\0') { return 0; } while (isspace(*str))//处理空格 { //处理空格 str++; //处理空格 } }
5.处理符号位
int my_atoi(const char *str) { assert(*str); if (*str == '\0') { return 0; } while (isspace(*str)) { str++; } int flag = 1;//符号位,如果为1则为正数,如果为-1则为负数,如果没加正号,默认为1; if (*str=='+') { flag = 1; str++;//跳过当前字符 } else if (*str == '-') { flag = -1; str++;//跳过当前字符 } }
6.处理数字字符
int my_atoi(const char *str) { assert(*str); if (*str == '\0') { return 0; } while (isspace(*str)) { str++; } int flag = 1; if (*str=='+') { flag = 1; str++; } else if (*str == '-') { flag = -1; str++; } long long r=0;//如果r 为int类型的话,超出范围,可能要截断,这里初始话为0,保证了空字符串返回0 while (*str != '\0')//字符还未到末尾 { if (isdigit(*str))//判断是否是字符 { r = r * 10 + flag*(*str - '0');//得到字符对应的整数 if (r > INT_MAX || r < INT_MIN)//如果超出范围 { if (flag == 1) { return INT_MAX;//超出int 最大值,就返回最大值 } if (flag == -1) { return INT_MIN;//超出int 最小值,就返回最小值 } } str++;//指针移动下一个字符 } else { return r;//如果str指向的不是字符的话,就返回r的值,比如1234a,此时r=1234 } } }
6.整体代码
#include<stdio.h> #include <assert.h> #include <ctype.h> #include <limits.h> #include<stdlib.h> enum State { VALID, INVALID }sta= INVALID; int my_atoi(const char* str) { assert(*str); if (*str == '\0') { return 0; } while (isspace(*str)) { str++; } int flag = 1; if (*str == '+') { flag = 1; str++; } else if (*str == '-') { flag = -1; str++; } long long r = 0; while (*str != '\0') { if (isdigit(*str)) { r = r*10+(*str-'0')*flag; if (r > INT_MAX || r < INT_MIN) { if (flag == 1) { return INT_MAX; } else if (flag == -1) { return INT_MIN; } } str++; } else { return r; } } sta = VALID; return (int)r; } int main() { char arr[] = "a111"; int ret=my_atoi(arr); if (sta == VALID) { printf("正常输出%d",ret); } if (sta == INVALID) { printf("非正常输出%d",ret); } }