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

スポンサーリンク

鍛錬 291

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

長い入力行を,入力のn文字目までにある最後の非ブランク文字の後で,”折りたたむ”プログラムを書け。プログラムは,行が非常に長くても,また指定桁までにブランクもタブもない場合についても,ちゃんと動作するようにせよ。

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

スポンサーリンク

プログラム

以下は、長い入力行を、入力のn文字目までにある最後の非ブランク文字の後で折りたたむプログラム、kr_1_22.c です。

// include
#include <stdio.h>

// preprocessor
#define MAXLINE  1000  // 入力可能な文字数の最大値
#define MAX_DIGITS 10  // 入力のn文字目を設定

// prototype
int my_getline(char line[], int lim);

// main
int main(void)
{
	char line[MAXLINE];
	int len;
	
	// 行を取得して表示
	while ((len = my_getline(line, MAXLINE)) > 0) {
		printf("%s", line);
		printf("\n");
	}
	
	return 0;
}

// ==========================================
// @brief      行を取得し,その長さを返す
// @param[out] line 取得した行
// @param[in]  lim  入力可能な文字数の最大長
// @return     i -> 取得した行の長さ
// @note       無し
// ==========================================
int my_getline(char line[], int lim)
{
	int c, i;
	int count;  // 文字数カウント
	
	// 文字数カウントを初期化
	count = 0;
	
	printf("入力行 = ");
	
	for (i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; ++i) {
		// 文字数カウントが上限以上の場合
		if (count >= MAX_DIGITS) {
			// タブか空白の場合
			if (c == '\t' || c == ' ') {
				line[i] = c;
				++i;
				line[i] = '\n';
				
				// 文字数カウントを初期化
				count = 0;
			}
			else
				line[i] = c;
		}
		// 文字数カウントが上限未満の場合
		else {
			line[i] = c;
			++count;
		}
	}
	
	// 最後に取得した文字が改行コードの場合
	if (c == '\n') {
		line[i] = c;
		++i;
	}
	line[i] = '\0';
	
	return i;
}
スポンサーリンク

実行結果

以下は、プログラム kr_1_22.c を実行し、動作を確認しています。

※ 設問にある「指定桁(入力のn文字目)」を、上記のプログラム kr_1_22.c では 10文字に設定しています。

※ 入力行の長さには改行コードも含みます。

***@ubuntu:~/***/test/c$ 
***@ubuntu:~/***/test/c$ gcc -Wall -Wextra kr_1_22.c -o kr_1_22
***@ubuntu:~/***/test/c$ ./kr_1_22
入力行 = 12345
12345

入力行 = 123 123
123 123

入力行 = 123456789A12345
123456789A12345

入力行 = 123456789A12345 123456789A12345
123456789A12345 
123456789A12345

入力行 = 123 123 123456789A12345 123
123 123 123456789A12345 
123
タイトルとURLをコピーしました