K&R 演習4-8 解答 (プログラミング言語C 第2版)

スポンサーリンク

鍛錬 837

K&R 演習4-8 解答 (プログラミング言語C 第2版)

押し戻す文字はたかだか1文字だとしよう。それに合うように getch と ungetch を書き直せ。

B.W.カーニハン D.M.リッチー 石田晴久 訳 『プログラミング言語C 第2版 ANSI 規格準拠』, (共立出版, 2017), pp.97.

スポンサーリンク

プログラム

以下は、押し戻す文字が1文字のみである場合に対応したプログラム、kr_4_8.c です。

pp.97 の時点でまだ登場していないライブラリ関数などはできる限り使用しないようにし、本書中で作成した関数を使用するようにしています。
記述方法(「 char *s 」または「 char s[] 」など)についても、できる限り pp.97 時点での記載通りにしています。

// include
#include <stdio.h>
#include <ctype.h>

// preprocessor
//#define BUFSIZE 100		// 入力文字を押し戻す際に利用するバッファのサイズ
#define BUFSIZE 2		// 入力文字を押し戻す際に利用するバッファのサイズ

// prototype
int getch(void);
void ungetch(int);

// variable
char buf[BUFSIZE];	// ungetch()用のバッファ
int bufp = 0;		// バッファbufにおける次の空き位置

// main
int main(void)
{
	int c;
	
	c = 'Y';
	ungetch(c);
	ungetch(c);	// error
	ungetch(c);	// error
	while ((c = getch()) != EOF) {
		putchar(c);
	}
	
	return 0;
}

// ==================================================
// @brief  1文字を取得する
// @param  無し
// @return buf[--bufp] -> バッファに押し戻された1文字
// @return getchar() -> 入力された1文字
// @note   bufp:0 -> 押し戻された1文字が存在しない
// @note   bufp:1 -> 押し戻された1文字が存在する
// ==================================================
int getch(void)
{
	return (bufp > 0) ? buf[--bufp] : getchar();
}

// ===============================================
// @brief  1文字を入力に戻す(バッファに格納する)
// @param  c [in],入力に戻す文字
// @return 無し
// @note   bufp:0 -> 押し戻された1文字が存在しない
// @note   bufp:1 -> 押し戻された1文字が存在する
// ===============================================
void ungetch(int c)
{
//	if (bufp >= BUFSIZE) {
	if (bufp > 0) {
		printf("ungetch: too many characters\n");
	}
	else {
		buf[bufp++] = c;
	}
}
スポンサーリンク

実行結果

以下は、プログラム kr_4_8.c を実行しています。

***@ubuntu:~/***/test/c$ 
***@ubuntu:~/***/test/c$ gcc -Wall -Wextra kr_4_8.c -o kr_4_8
***@ubuntu:~/***/test/c$ ./kr_4_8
ungetch: too many characters
ungetch: too many characters
Y
タイトルとURLをコピーしました