#include <ctype.h>
/* atof: convert string s to double */
double atof(char s[])
{
double val, power;
int i, sign;
for (i = 0; isspace(s[i]); i++) /* skip white space */
;
sign = (s[i] == '-') ? -1 : 1;
if (s[i] == '+' || s[i] == '-')
i++;
for (val = 0.0; isdigit(s[i]); i++)
val = 10.0 * val + (s[i] - '0');
if (s[i] == '.')
i++;
for (power = 1.0; isdigit(s[i]); i++) {
val = 10.0 * val + (s[i] - '0');
power *= 10;
}
return sign * val / power;
}
前面的跳过空白符的for无法理解
找到小数点后的操作也无法理解
???
10 个解决方案
#1
把语句一条条拆开就容易理解,比如:
for (i = 0; isspace(s[i]); i++) /* skip white space */
;
可以拆解为:
i = 0;
while(isspace(s[i])
{
i++;
}
#2
for (i = 0; isspace(s[i]); i++) /* skip white space */
;
跳过空白符,唯一操作就是i++,所以为空白符的s[i]都被跳过了,接下来的s[i]是第一个非空字符。
而至于求小数部分操作:
for (power = 1.0; isdigit(s[i]); i++) {
val = 10.0 * val + (s[i] - '0');
power *= 10;
这个循环计算结束之后,val是个整数值。power是val要除的数。
例如,小数0.456经过计算之后,val是456,power是1000。456/1000=0/456。
for (i = 0; isspace(s[i]); i++) /* skip white space */
;
跳过空白符,唯一操作就是i++,所以为空白符的s[i]都被跳过了,接下来的s[i]是第一个非空字符。
而至于求小数部分操作:
for (power = 1.0; isdigit(s[i]); i++) {
val = 10.0 * val + (s[i] - '0');
power *= 10;
这个循环计算结束之后,val是个整数值。power是val要除的数。
例如,小数0.456经过计算之后,val是456,power是1000。456/1000=0/456。
for (i = 0; isspace(s[i]); i++) /* skip white space */
;
可以拆解为:
i = 0;
while(isspace(s[i])
{
i++;
}
#2
for (i = 0; isspace(s[i]); i++) /* skip white space */
;
跳过空白符,唯一操作就是i++,所以为空白符的s[i]都被跳过了,接下来的s[i]是第一个非空字符。
而至于求小数部分操作:
for (power = 1.0; isdigit(s[i]); i++) {
val = 10.0 * val + (s[i] - '0');
power *= 10;
这个循环计算结束之后,val是个整数值。power是val要除的数。
例如,小数0.456经过计算之后,val是456,power是1000。456/1000=0/456。
#3
把语句一条条拆开就容易理解,比如:
for (i = 0; isspace(s[i]); i++) /* skip white space */
;
可以拆解为:
i = 0;
]while(isspace(s[i])
{
i++;
}
[/quote
它是跳过所有空格还是只跳过一个第一个呢?
这个while执行了多少次
#4
for (i = 0; isspace(s[i]); i++) /* skip white space */
;
跳过空白符,唯一操作就是i++,所以为空白符的s[i]都被跳过了,接下来的s[i]是第一个非空字符。
而至于求小数部分操作:
for (power = 1.0; isdigit(s[i]); i++) {
val = 10.0 * val + (s[i] - '0');
power *= 10;
这个循环计算结束之后,val是个整数值。power是val要除的数。
例如,小数0.456经过计算之后,val是456,power是1000。456/1000=0/456。
for (i = 0; isspace(s[i]); i++) /* skip white space */
;
跳过空白符,唯一操作就是i++,所以为空白符的s[i]都被跳过了,接下来的s[i]是第一个非空字符。
而至于求小数部分操作:
for (power = 1.0; isdigit(s[i]); i++) {
val = 10.0 * val + (s[i] - '0');
power *= 10;
这个循环计算结束之后,val是个整数值。power是val要除的数。
例如,小数0.456经过计算之后,val是456,power是1000。456/1000=0/456。
for (i = 0; isspace(s[i]); i++) /* skip white space */
;
跳过空白符,唯一操作就是i++,所以为空白符的s[i]都被跳过了,接下来的s[i]是第一个非空字符。
而至于求小数部分操作:
for (power = 1.0; isdigit(s[i]); i++) {
val = 10.0 * val + (s[i] - '0');
power *= 10;
这个循环计算结束之后,val是个整数值。power是val要除的数。
例如,小数0.456经过计算之后,val是456,power是1000。456/1000=0/456。