4.2 非整数を返す関数, 演習4-2 K&R プログラミング言語C
2010年01月07日
4.2 非整数を返す関数
atof
が返す double
の値は return
される際に int
に変換される。
これは、atoi
が int
を返す関数であるため。
そこで、コンパイラが警告を出さないように明示的にキャスト(型変換)している。
/* 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規格準拠
posted with amazlet at 09.11.27
B.W. カーニハン D.M. リッチー
共立出版
売り上げランキング: 9726
共立出版
売り上げランキング: 9726