演習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)) != '
    /* 省略 */
    line_pos = 0;
    while (mygetline(line, MAXLINE) > 0) {
        while ((type = getop(s)) != '\0') {
            switch (type) {
    /* 省略 */
        }
        line_pos = 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] = '
/* 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;

}
'
; 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] = '
/* 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;

}
'
; 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] = '
/* 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;
}
'
; return i; }
プログラミング言語C 第2版 ANSI規格準拠
B.W. カーニハン D.M. リッチー
共立出版
売り上げランキング: 9726
«
»