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

スポンサーリンク

鍛錬 832

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

文字列全体を入力に戻すルーチン ungets(s) を書け。ungets では buf や bufp について知る必要があるか,あるいは ungetch を使うだけにすべきか?

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

 
スポンサーリンク

プログラム

以下は、文字列全体を入力に戻すプログラム、kr_4_7.c です。

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

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

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

// prototype
int getch(void);
void ungetch(int);
void ungets(char s[]);

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

// main
int main(void)
{
	char s[256] = "Language, C.";
	int c;
	
	ungets(s);
	while ((c = getch()) != EOF) {
		putchar(c);
	}
	
	return 0;
}

// ==================================================
// @brief  文字列全体を入力に戻す(バッファに格納する)
// @param  s [in],入力に戻す文字列
// @return 無し
// @note   無し
// ==================================================
void ungets(char s[])
{
	int len;
	int i;
	
	len = strlen(s);
	if (len >= (BUFSIZE - bufp)) {
		printf("ungets: too many characters\n");
	}
	else {
		i = len - 1;
		while (i >= 0) {
			ungetch(s[i]);
			i--;
		}
	}
}

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

// ============================================
// @brief  文字を入力に戻す(バッファに格納する)
// @param  c [in],入力に戻す文字
// @return 無し
// @note   無し
// ============================================
void ungetch(int c)
{
	if (bufp >= BUFSIZE) {
		printf("ungetch: too many characters\n");
	}
	else {
		buf[bufp++] = c;
	}
}

実行結果

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

***@ubuntu:~/***/test/c$ 
***@ubuntu:~/***/test/c$ gcc -Wall -Wextra kr_4_7.c -o kr_4_7
***@ubuntu:~/***/test/c$ ./kr_4_7
Language, C.