atoi函数: 假设我们不考虑进制问题,只考虑10进制
int atoi(char *str)
将字符串转换为int整数。需要考虑的问题:
-
- 字符串是不是不能为NULL? assert()
- 字符串开头部分有空白符(isspace())怎么办?
- 字符串中带符号位+-怎么办?
- 字符串转变过程中遇到非数字要直接返回当前值,怎么办?
- 如何转变?转变的方法是什么?*10+
- 溢出怎么办?
- 溢出有上溢和下溢之分?所以需要考虑int的范围
- 如果还要考虑8进制 16进制 2进制 10进制的问题的话,8进制以0开头,16进制以0x或者0X开头,10进制则没有,2进制的话。
实现代码是参考了http://www.wypblog.com/archives/224:
#include <stdio.h>
#include <assert.h>
#define MAX_INT ((1 << 31) - 1)
#define MIN_INT (-(1 << 31))
int atoi(const char *str){
assert(str != NULL);
char *temp = str;
int i = 0;
int flags = 0;
unsigned int sum = 0;
while(*temp == ' ' || *temp == '\t' || *temp == '\n') ++temp;
// 下面这个判断貌似没有必须必要
if(*temp != '-' && *temp != '+' && (*temp < '0' || *temp > '9')){//第一个字符不是数字
return 0;
}
if(*temp == '-'){ //第一个是负号
flags = 1;
++temp;
}else if(*temp == '+'){
++temp;
}
while(*temp >= '0' && *temp <= '9'){
if(!flags){//上溢
if(sum > MAX_INT / 10 || (sum == MAX_INT / 10 && (*temp > '7'))){
return MAX_INT;
}
}else{//下溢
if(sum > MAX_INT / 10 || (sum == MAX_INT / 10 && (*temp > '8'))){
return MIN_INT;
}
}
sum = sum * 10 + (*temp - '0');
++temp;
}
return flags ? (-1 * sum) : sum;
}
int main(){
printf("%d\n", atoi("123"));
return 0;
}
说明:
反转部分写的稍显麻烦,应该利用--str和dst来进行反转的。