val=10.0*val+(s[i]-'0')

1个回答

  • 好像过去好久了,现在才看见.

    首先你的这个代码是有问题的,正确代码如下:

    #include

    double atof(char s[])

    {

    double val,power;

    int i,sign;

    for(i=0;isspace(s[i]);i++)

    ;

    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.0;

    }

    return sign*val/power;

    }

    int main()

    {

    char str[10] = {0};

    scanf("%s",str);

    printf("%lfn",atof(str));

    }

    问题除了你的书写上的遗漏,然后主要有两点逻辑上的问题.

    我先给你说一下这个函数的思想:就是把一个字符串转换成float类型,首先去除不必要的空格,sign代表的就是这个转换出来的float类型的数据时正还是负,正值成1,负值乘以-1;然后提取出有数字的部分并保存为整形,同时记录小数点后有几位数字;最后用取得的整形数除以小数点所应该到的位数,如-123.45,那么sign是-1,取出来的整形是12345,然后再除以100为123.45,再乘以-1就是转换后的float型数据了.

    你代码逻辑问题:1、val=10.0*val+val+(s[i]-'0');这句话应该是val=10.0*val + (s[i]-'0');目的就是把有数字的数搞成整形的(这个整形在这表示把字符串中有数字的放到小数点的左侧,因为val是个double,所以严格说不是整形),比如12:刚开始val=0.0,一次循环后就是1.0,然后第二次循环就是12.0了,每次乘以10就相当于把十进制的数字左移一位呗,增大十倍嘛;2、最后一个for循环应该打上大括号,同时把power*=10.0;这句话括进去,表示把小数点后边的数字连同前边的数字整成一个整形数的时候乘了多少次10(power/10就是小数点的位数),等最后再给除回来.

    再详细点就是:比如是12.350,第一次取值循环结束val=12,然后第二次取值循环结束val=12350,power=1000.0(乘了三次10),那么最后一句就是12350/1000.0=12.35.

    够详细了吧.自己列一个数字,跟着代码走读一次,按照计算机运行的过程在脑海中运行一次就明白了~~~