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

スポンサーリンク

鍛錬 80

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

単語カウント・プログラムのテストは,どのようにするか? もしバグがあるとしたら,それをあばき出すにはどんな入力をするのがよいか?

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

スポンサーリンク

考えられるバグと、それを試す入力について

単語カウントプログラムは、文字数・行数・単語数をカウントするプログラムですが、各々の項目について、カウントの上限が定められていません。

各々の項目は、プログラム中にて int で宣言されていますが、int型の範囲は –2147483648 ~ 2147483647 なので、2147483647 を超えると不具合が起きそうです。

テストを行う際、2147483647 回にわたり手で入力していたら途方もないので、プログラムの一部をコメントアウト・追記して、テストを行いました。

スポンサーリンク

プログラム

以下は、単語カウントプログラムをテスト用に編集したプログラム、kr_1_11.c です。

#include <stdio.h>

#define IN   1
#define OUT  0

int main(void)
{
	int c, nl, nw, nc, state;
	
	state = OUT;
	nl = nw = nc = 0;
	
	// 追加 ------------------------------->
	//   2147483647(intの最大値)
	nc = 2147483640;
	// ------------------------------------<
	
	// コメントアウト --------------------->
//	while ((c = getchar()) != EOF) {
	// ------------------------------------<
	
	// 追加 ------------------------------->
	while (nc >= 0) {
	// ------------------------------------<
		
		// 追加 --------------------------->
		printf("nc = %d\n", nc);
		c = '\n';
		// --------------------------------<
		
		++nc;
		if (c == '\n')
			++nl;
		if (c == ' ' || c == '\n' || c == '\t')
			state = OUT;
		else if (state == OUT) {
			state = IN;
			++nw;
		}
	}
	printf("%d %d %d\n", nl, nw, nc);
	
	return 0;
}
スポンサーリンク

実行結果

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

***@ubuntu:~/***/test/c$ 
***@ubuntu:~/***/test/c$ gcc -Wall -Wextra kr_1_11.c -o kr_1_11
***@ubuntu:~/***/test/c$ ./kr_1_11
nc = 2147483640
nc = 2147483641
nc = 2147483642
nc = 2147483643
nc = 2147483644
nc = 2147483645
nc = 2147483646
nc = 2147483647
8 0 -2147483648

 
上記に示した通り、文字数が 2147483647 を超えると、その次の値が 2147483648 ではなく、マイナスの -2147483648 になることが分かりました。

タイトルとURLをコピーしました