/* 将str转换为整型 */
int atoi(char *str)
{
int i;
int n, sign;
for(i = 0; isspace(str[i]); i++)
;
sign = (str[i] == '-') ? -1 : 1;
if(str[i] == '+' || str[i] == '-')
i++;
for(n = 0; isdigit(str[i]; i++)
n = n * 10 + (str[i] - '0');
return (n * sign);
}
/* 将str转换为相应的双精度浮点数 */
double atof(char *str)
{
int i, sign;
double val, power;
for(i = 0; isspace(str[i]); i++)
;
sign = (str[i] == '-') ? -1 : 1;
if(str[i] == '+' || str[i] == '-')
i++;
for(val = 0.0; isdigit(str[i]); i++)
val = val * 10.0 + (str[i] - '0');
if(str[i] == '.')
i++;
for(power = 1.0; isdigit(str[i]); i++)
{
val = 10.0 * val + (str[i] - '0');
power *= 10;
}
return (val * sign / power);
}
/* 可以处理形如123.45e-6的科学表示法 */
double atof_ext(char *str)
{
int i, sign, exp;
double val, power;
for(i = 0; isspace(str[i]); i++)
;
sign = (str[i] == '-') ? - 1 : 1;
if(str[i] == '+' || str[i] == '-')
i++;
for(val = 0.0; isdigit(str[i]); i++)
val = val * 10.0 + (str[i] - '0');
if(str[i] == '.')
i++;
for(power = 10.0; isdigit(str[i]; i++)
{
val = val * 10.0 + (str[i] - '0');
power *= 10;
}
val = sign * val / power;
if(str[i] == 'e' || str[i] == 'E')
{
sign = (str[++i] == '-') ? -1 : 1;
if(str[i] == '+' || str[i] == '-')
i++;
for(exp = 0; isdigit(str[i]); i++)
exp = 10 * exp + (str[i] - '0');
if(sign == 1)
while(exp-- > 0)
val *= 10;
else
while(exp-- > 0)
val /= 10;
}
return val;
}