《c程序设计语言》读书笔记-4.2-扩充atof函数

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <ctype.h>

double atof_num(char s[])
{
    double val,power = 1.0;
    int i,sign,j,val_lat = 0;

    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;
    }
    if(s[i] == 'e' || s[i] == 'E')
    {
        i++;
        if(s[i] == '-')
        {
            i++;
            while(isdigit(s[i]))
            {
                val_lat = 10 * val_lat + (s[i] - '0');
                i++;
            }
            for(j = 0;j < val_lat;j++ )
                power *= 10.0;
            return val * sign / power;
        }

        else if(s[i] == '+')
        {
            i++;
            while(isdigit(s[i]))
            {
                val_lat = 10 * val_lat + (s[i] - '0');
                i++;
            }
            for(j = 0;j < val_lat;j++ )
                power /= 10.0;
            return val * sign / power;
        }
        else
        {

            while(isdigit(s[i]))
            {
                val_lat = 10 * val_lat + (s[i] - '0');
                i++;
            }
            for(j = 0;j < val_lat;j++ )
                power /= 10.0;
            return val * sign / power;
        }
    }
    return val * sign / power;
}

int main()
{
    char s[100],c;
    int i = 0;;
    double result;


    while((c = getchar()) != '\n')
        s[i++] = c;
    s[i] = '\0';

    result = atof_num(s);

    printf("%f\n",result);

	return 0;
}

1、isspace、isdigit函数在ctype.h中;

2、else后面不能加判断语句;

3、s[i++]此类要小心用!

 

posted @ 2014-11-12 00:12  司空格子Ored  阅读(236)  评论(0编辑  收藏  举报