演習5-2 K&R プログラミング言語C

演習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規格準拠
B.W. カーニハン D.M. リッチー
共立出版
売り上げランキング: 9726
«
»