演習5-2 K&R プログラミング言語C
2010年01月31日
演習5-2
#include <stdio.h> #include <ctype.h> #define SIZE 100 #define BUFSIZE 100 int getch(void); void ungetch(int); int main(void) { double array[SIZE]; int n, m, getfloat(double *); int i; n = 0; while (n < SIZE && (m = getfloat(&array[n])) != EOF) { if (m > 0) { n++; } } for (i = 0; i < n; i++) { printf("%f\n", array[i]); } return 0; } /* getfloat : 入力から次の整数を取り出して *pd に入れる */ int getfloat(double *pd) { int c, sign, sign_c; int is_dec = 0; double dc = 1.0; while (isspace(c = getch())) /* 空白を飛ばす */ ; if (!isdigit(c) && c != EOF && c != '+' && c != '-' && c != '.') { ungetch(c); /* 数字ではない */ return 0; } sign = (c == '-') ? -1 : 1; if (c == '+' || c == '-') { sign_c = c; c = getch(); } if (!isdigit(c) && c != EOF && c != '.') { ungetch(sign_c); return 0; } for (*pd = 0.0; isdigit(c) || c == '.'; c = getch()) { if (c == '.') { is_dec = 1; continue; } if (is_dec) { *pd = *pd + (dc /= 10) * (c - '0'); } else { *pd = 10 * *pd + (c - '0'); } } *pd *= sign; if (c != EOF) ungetch(c); return c; } char buf[BUFSIZE]; /* ungetch 用のバッファ */ int bufp = 0; /* buf 中の次の空き位置 */ int getch(void) /* (押し戻された可能性もある)1文字をとってくる */ { return (bufp > 0) ? buf[--bufp] : getchar(); } void ungetch(int c) { if (bufp >= BUFSIZE) { printf("ungetch: too many characters\n"); } else { buf[bufp++] = c; } }
実行結果
$ cat hoge.txt 123.123 +456.123 + 789.123 -321.123 - 654.123 - 987.123 .009 -.009 - .009 $ ./ex5-2 <hoge.txt 123.123000 456.123000 789.123000 -321.123000 -654.123000 -987.123000 0.009000 -0.009000 -0.009000
プログラミング言語C 第2版 ANSI規格準拠
posted with amazlet at 09.11.27
B.W. カーニハン D.M. リッチー
共立出版
売り上げランキング: 9726
共立出版
売り上げランキング: 9726