演習4-10 K&R プログラミング言語C

4.3 の電卓プログラムを修正する。

演習4-10

getch, ungetch での処理を読込行文字配列のインデックスのインクリメント・デクリメントで行う。

読み込み行を外部変数 line に、読み込み文字位置を line_pos に保持する。

/* 省略 */
#define MAXLINE 1024
/* 省略 */
static char line[MAXLINE];
static int line_pos;

main の読み込みの処理を行読み込みに変更する。

    /* 省略 */
    line_pos = 0;
    while (mygetline(line, MAXLINE) > 0) {
        while ((type = getop(s)) != '\0') {
            switch (type) {
    /* 省略 */
        }
        line_pos = 0;
    }
    /* 省略 */

getop を行読み込みでの処理に変更する。

/* getop: 次の演算子あるいは数値の被演算数をとってくる */
static int getop(char s[])
{
    int i, c;

    while ((s[0] = c = line[line_pos++]) == ' ' || c == '\t')
        ;

    s[1] = '\0';
    if (!isdigit(c) && c != '.' && c != '-') {
        return c; /* 数ではない */
    }
    i = 0;
    if (c == '-') {
        if (!isdigit(s[++i] = c = line[line_pos++])) { /* 次の文字が数字でない場合 */
            line_pos--; /* 1文字押し戻す */
            return '-';
        }
    }
    if (isdigit(c)) { /* 整数部を集める */
        while (isdigit(s[++i] = c = line[line_pos++]))
            ;
    }
    if (c == '.') { /* 小数部を集める */
        while (isdigit(s[++i] = c = line[line_pos++]))
            ;
    }
    s[i] = '\0';
    if (c != EOF) {
        line_pos--;
    }
    return NUMBER;

}

行読み込みの関数 mygetline を追加する。

/* s に行を入れ、長さを返す */
static int mygetline(char s[], int lim)
{
    int c, i;

    i = 0;
    while (--lim > 0 && (c = getchar()) != EOF && c != '\n') {
        s[i++] = c;
    }
    if (c == '\n') {
        s[i++] = c;
    }
    s[i] = '\0';
    return i;
}
プログラミング言語C 第2版 ANSI規格準拠
B.W. カーニハン D.M. リッチー
共立出版
売り上げランキング: 9726
コメント

Why is s[1] ”? The code seems to work perfectly fine even after omitting that line, so why does the second-positione character of the array need to be null? Answer onegai.

コメント by モンキー·D·ルフィ | 2014年5月5日 - 11:23
Top