2013年4月30日火曜日

開発環境

プログラミング言語C 第2版 ANSI規格準拠 (B.W. カーニハン D.M. リッチー (著)、 石田 晴久 (翻訳)、共立出版)の第5章(ポインタと配列)、5.2(ポインタと関数引数)、演習5-1を解いてみる。

その他参考書籍

演習 5-1.

コード

sample.c

#include <stdio.h>
#include <ctype.h>
#define SIZE 100

int getint(int *pn);
int getch(void);
void ungetch(int);
int buf = 0;

int main(void)
{
    int n, array[SIZE], i;

    for (n = 0; n < SIZE && getint(&array[n]) != EOF; n++)
        ;
    for(i = 0; i <= n; i++)
        printf("array[%d] = %d\n", i, array[i]);

    return 0;
}

int getint(int *pn)
{
    int c, sign;
    
    while (isspace(c = getch()))
        ;
    if (!isdigit(c) && c != EOF && c != '+' && c != '-') {
        *pn = 1000000;
        return 0;
    }
    sign = (c == '-') ? -1 : 1;

    if (c == '+' || c == '-') {
        if (!isdigit(c = getch())) {
            if (c != EOF)
                ungetch(c);
            return 0;
        }
    }
    
    if (c == EOF) {
        *pn = 1000000;
        return c;
    }
    for (*pn = 0; isdigit(c); c = getch()){
        *pn = 10 * *pn + (c - '0');
    }
    *pn *= sign;
    if (c != EOF) {
        ungetch(c);
    }
    return c;
}

int getch(void)
{
    int c;
    
    if (buf != 0)
        c = buf;
    else
        c = getchar();
    buf = 0;
    return c;
}

void ungetch(int c)
{
    if (buf != 0)
        printf("ungetch: too many characters\n");
    else
        buf = c;
}

入出力結果(Terminal)

$ cat tmp.txt
   a0bc23 456d-1 -2 -15 +1 +2 +15
-12345 end$ cat tmp.txt | ./a.out
array[0] = 1000000
array[1] = 0
array[2] = 1000000
array[3] = 1000000
array[4] = 23
array[5] = 456
array[6] = 1000000
array[7] = -1
array[8] = -2
array[9] = -15
array[10] = 1
array[11] = 2
array[12] = 15
array[13] = -12345
array[14] = 1000000
array[15] = 1000000
array[16] = 1000000
array[17] = 1000000
$

0 コメント:

コメントを投稿