4.2 非整数を返す関数, 演習4-2 K&R プログラミング言語C

4.2 非整数を返す関数

atof が返す double の値は return される際に int に変換される。
これは、atoiint を返す関数であるため。
そこで、コンパイラが警告を出さないように明示的にキャスト(型変換)している。

/* atoi : atof を使って文字列 s を整数に変換する */
int atoi(char s[])
{
    double atof(char s[]);

    return (int) atof(s);
}

演習4-2

#include <stdio.h>
#include <ctype.h>

double atof(char str[]);

int main(int argc, char *argv[])
{
    char *str1 = "1000";
    char *str2 = "0.001";
    char *str3 = "1.0+e3";
    char *str4 = "1.0-e3";

    printf("%s => %f\n", str1, atof(str1));
    printf("%s => %f\n", str2, atof(str2));
    printf("%s => %f\n", str3, atof(str3));
    printf("%s => %f\n", str4, atof(str4));

    return 0;
}

/* 文字列 s を double に変換する */
double atof(char s[])
{
    double val, power;
    int i, sign;
    double esize, epower;
    int esign;

    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] == '+' || s[i] == '-') {
        esign = s[i] == '-' ? -1 : 1;
        i++;
    }
    if (s[i] == 'e' || s[i] == 'E') {
        i++;
    }
    for (esize = 0.0; isdigit(s[i]); i++) {
        esize = 10.0 * esize + (s[i] - '0');
    }
    if (esign > 0) {
        for (epower = 1.0; esize > 0; esize--) {
            epower *= 10.0;
        }
    } else {
        for (epower = 1.0; esize > 0; esize--) {
            epower /= 10.0;
        }
    }
    return epower * sign * val / power;
}

実行結果

$ ./ex4-2
1000 => 1000.000000
0.001 => 0.001000
1.0+e3 => 1000.000000
1.0-e3 => 0.001000
プログラミング言語C 第2版 ANSI規格準拠
B.W. カーニハン D.M. リッチー
共立出版
売り上げランキング: 9726
«
»