atof 和 atoi 其实就是解析一段字符串。
下面是将字符串解析成浮点数需要考虑的格式:(注意,下面考虑的所有东西可能不存在字符串中)
①删除无意义的空格
②考虑该字符串的符号
③解析第一段正文(假如遇到不合法字符,那么解析到此结束;否则继续往下解析)
④看是否有小数点
⑤解析第二段正文
⑥看是否存在e/E
⑦假如存在e/E,那么就开始判断指数的符号和指数的大小
double my_atof(const char *str)
{
//" +34555.444e+4"
//"无意义的空格 +/ /- 正文 . 正文 e +/ /- 正文"
double s = 0.0, d = 10.0, flag = 1.0;
int count = 0;
while (*str == ' ')str++;//① 跳过无效空格
if (*str == '-'){ flag = -1.0; str++; }//② 判断符号
else if (*str == '+'){ str++; }
while (*str >= '0' && *str <= '9')//③ 判断第一段正文
{
s = s * 10 + *str - '0';
str++;
}
if (*str == '.')//④ 判断是否存在点
str++;
while (*str >= '0' && *str <= '9')//⑤ 判断第二段正文
{
s += (*str - '0') / d;
d *= 10.0;
str++;
}
if (*str == 'e' || *str == 'E')//⑥ 判断是否存在e/E
{
str++;
if (*str == '+')//⑦ 在⑥成立的情况下判断指数的符号以及大小
{
str++;
while (*str >= '0' && *str <= '9')
{
count = count * 10 + *str - '0';
str++;
}
while (count--)
s *= 10.0;
}
if (*str++ == '-')//⑦ 在⑥成立的情况下判断指数的符号以及大小
{
while (*str >= '0' && *str <= '9')
{
count = count * 10 + *str - '0';
str++;
}
while (count--)
s /= 10.0;
}
}
return s*flag;
}
下面是将字符串解析成整型数需要考虑的格式:(注意,下面考虑的所有东西可能不存在字符串中)
①删除无意义的空格
②考虑该字符串的符号
③解析第一段正文(假如遇到不合法字符,那么解析到此结束;否则继续往下解析)
int my_atoi(const char*str)
{
int s = 0, flag = 1;
while (*str == ' ')
str++;
if (*str++ == '-')
flag = -1;
while (*str >= '0' && *str <= '9')
{
s = s * 10 + *str - '0';
str++;
}
return s*flag;
}