模拟一个比较少见的转化函数atoi
定义 int atoi (const char * str);
功能 数字字符转化为数字
转化种类如下图
1、遇到0或空格默认忽略
2、有符号不舍去
3、+自动忽略
4、末尾有非数字字符忽略
第一步创建循环输入字符串
int main() { char arr[255] = { 0 }; while (scanf("%s", arr)!=EOF) { int ret=my_atoi(arr); printf("%d\n",ret); } return 0; }
第二步开始创建函数,并解决第一个数组为空情况问题
int my_atoi(const char* str) { assert(str);//断言 int flag = 1;//创建falg解决正负号问题 int ret = 0; //首先判断不为空 if (*str == '\0') { return 0; } }
第三步 解决’0’和’ '问题
//如果是'0'或者' '忽略,可能出现多个空格或者'0'使用循环 while (*str == '0' || *str == ' ') { str++; }
第四步 解决正负号问题
//正负号情况 if (*str == '-') { flag = -1;//把flag变成-1就可以在转化的时候保留-号 str++; } else if(*str=='+') { flag = 1; str++; }
第五步 转化
while (*str != '\0')//需要多次转化 使用循环 { if (*str >='1' && *str <= '9' )//判断是否是在1-9内的数字字符 { ret = ret * 10 + flag * (*str - '0'); if (ret<INT_MIN || ret>INT_MAX)//过大或过小返回0 { return 0; } } else { break; } *str++; return (int)ret; }
总代码
int my_atoi(const char* str) { assert(str); int flag = 1; int ret = 0; //首先判断不为空 if (*str == '\0') { return 0; } //如果是'0'或者' '忽略,可能出现多个空格或者'0'使用循环 while (*str == '0' || *str == ' ') { str++; } //正负号情况 if (*str == '-') { flag = -1; str++; } else if(*str=='+') { flag = 1; str++; } //转换 while (*str != '\0') { if (*str >='1' && *str <= '9' ) { ret = ret * 10 + flag * (*str - '0'); if (ret<INT_MIN || ret>INT_MAX) { return 0; } } else { break; } *str++; } return (int)ret; } int main() { char arr[255] = { 0 }; while (scanf("%s", arr)!=EOF) { int ret=my_atoi(arr); printf("%d\n",ret); } return 0; }