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

スポンサーリンク

鍛錬 74

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

二つ以上の空白を一つの空白に置き換えながら,入力を出力に複写するプログラムを書け。

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

 
スポンサーリンク

プログラム

以下のプログラム kr_1_9.c は、2つ以上空白が続いた場合は1つの空白に置き換えながら、入力を出力に複写します。

#include <stdio.h>
 
int main(void)
{
    int c;
    int count_blank;
     
    // 初期化
    count_blank = 0;  // 空白
     
    // ストリームからデータを取得
    while ((c = getchar()) != EOF) {
        // 空白の場合
        if (c == ' ') {
            // 空白が2つ以上連続していない場合
            if (count_blank == 0) {
				putchar(c);
                 
                // 空白をカウント
                count_blank++;
			}
        }
        // 空白ではない場合
        else {
            putchar(c);
             
            // 空白のカウントをリセット
            count_blank = 0;
        }
    }
     
    return 0;
}

実行結果

以下は、プログラム kr_1_9.c を次の順序で実行しています。

  1. abc と入力して、エンターキーを押下
  2. d(スペース1個)ef と入力して、エンターキーを押下
  3. g(スペース2個)hi と入力して、エンターキーを押下
  4. j(スペース3個)kl と入力して、エンターキーを押下
***@ubuntu:~/***/test/c$ 
***@ubuntu:~/***/test/c$ gcc -Wall -Wextra kr_1_9.c -o kr_1_9
***@ubuntu:~/***/test/c$ ./kr_1_9
abc
abc
d ef
d ef
g  hi
g hi
j   kl
j kl

 
上記に示した通り、2つ以上空白が続いた場合は1つの空白に置き換えながら、入力を出力に複写することができました。