思路分析
首先要确定atoi()的功能:
输入:字符串
输出:相应的数字。
这一步骤是由高位到低位进行的,因此按照十进制数字的规则就能实现。
其次,要防止异常发生:
如果是输入是字母:返回0
如果输入是’+‘’-'两个符号:识别正负
如果输入是空串:返回0
如果输入是其他符号:返回0
如果输入是空格: 跳过
(这一步骤应该就是题目所说的字符分类)
最后,数字处理类问题要防止溢出。
代码编写
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <limits.h>
int new_atoi(char *str);
//将字符串转换为整数
int main(int argc, const char * argv[]) {
char * string;
int result;
string = (char *)malloc(50 * sizeof(char));
printf("input string:");
gets(string);
result = new_atoi(string);
printf("the result is %d\n",result);
//类型判断,char每个字符1字节,int是数字4个字节
if(sizeof(result) == sizeof(int)){
printf("result is an integer.\n");
}
free(string);
return 0;
}
int new_atoi(char *str){
int number=0;
int flag=1;
if(str == NULL){
return 0;
}
if((*str) == '+'){
flag = 1;
}
if((*str) == '-'){
flag = -1;
}
while((*str)!='\0'){
if(isdigit(*str)){
//从高位到低位,十进制
number = number * 10 + (*str - '0');
//然后处理溢出问题
if(number > INT_MAX){
return INT_MAX;
}
if (number < INT_MIN) {
return INT_MIN;
}
}else if ((*str)=='-' || (*str)=='+' || isblank(*str)){
str++;
continue;
//这里continue是直接跳转到循环开头,并不是跳转到末尾的str自增语句
}else{
return 0;
}
str++;
}
number *= flag;
return number;
}