演習4-10 K&R プログラミング言語C
2010年01月20日
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規格準拠
posted with amazlet at 09.11.27
B.W. カーニハン D.M. リッチー
共立出版
売り上げランキング: 9726
共立出版
売り上げランキング: 9726