1.5.2 文字のカウント, 1.5.3 行数のカウント, 1.5.4 単語のカウント, 演習1-8, 演習1-9, 演習1-10, 演習1-11, 演習1-12 K&R プログラミング言語C

1.5.2 文字のカウント

whilefor ではループ本体に入る前にテストが行なわれる。
最初からテストに失敗した場合は本体は1度も実行されない。

1.5.3 行数のカウント

シングルクオートで囲まれた文字の内部表現を文字定数と呼ぶ。
文字定数は整数を表現する。
'A'65 を表わす。
エスケープ文字は文字定数の中でも有効。'\n'10 を表す。
'\n' は1つの文字を表すのに対し、"\n" は1つの文字だけを含む "文字列" を表わす。

演習1-8

#include <stdio.h>

int main(int argc, char *argv[])
{
    int c, ws, tb, nl;

    ws = 0;
    tb = 0;
    nl = 0;

    while ((c = getchar()) != EOF) {
        if (c == ' ') {
            ++ws;
        }
        if (c == '\t') {
            ++tb;
        }
        if (c == '\n') {
            ++nl;
        }
    }
    printf("%d\t%d\t%d\n", ws, tb, nl);

    return 0;
}

実行結果

$ cat hoge1-8.txt
空白 と タブ            と
改行を
数える プログラム
です。
$ cat hoge1-8.txt | ./ex1-8
3       2       4

演習1-9

#include <stdio.h>

int main(int argc, char *argv[])
{
    int c, buf;

    while ((c = getchar()) != EOF) {
        if (c == ' ') {
            buf = ' ';
        } else {
            if (buf == ' ') {
                putchar(buf);
                buf = '
#include <stdio.h>

int main(int argc, char *argv[])
{
    int c, buf;

    while ((c = getchar()) != EOF) {
        if (c == ' ') {
            buf = ' ';
        } else {
            if (buf == ' ') {
                putchar(buf);
                buf = '\0';
            }
            putchar(c);
        }
    }

    return 0;
}
'
; } putchar(c); } } return 0; }

実行結果

$ cat hoge1-9.txt
連続する空白           を置き換えます。
1つの空白 はそのままです。
$ cat hoge1-9.txt | ./ex1-9
連続する空白 を置き換えます。
1つの空白 はそのままです。

演習1-10

#include <stdio.h>

int main(int argc, char *argv[])
{
    int c;

    while ((c = getchar()) != EOF) {
        if (c == '\t') {
            printf("\\t");
        } else if (c == '\b') {
            printf("\\b");
        } else if (c == '\\') {
            printf("\\\\");
        } else {
            putchar(c);
        }
    }

    return 0;
}

実行結果

$ cat hoge1-10.txt
タブ    と、
バックスペー#を表示して、
バックスラッシュ\をエスケープ表示します。
$ cat hoge1-10.txt | ./ex1-10
タブ\tと、
バックスペース\bを表示して、
バックスラッシュ\\をエスケープ表示します。

1.5.4 単語のカウント

nl = nw = nc = 0;

3つの変数全てに 0 をセットする。
代入文には値があるため nl = (nw = (nc = 0)); と等しい。

if (c == ' ' || c == '\n' || c == '\t') {

&&|| でつながれた式は左から順に評価されて行く。
|| では評価が真であれば以降のテストは実行されない。

演習1-11

1行テキストでは末尾の改行の有無で行数のカウントが異なる。

$ echo "foo" >hoge1-11.txt
$ cat hoge1-11.txt | ./wc
1 1 4
$ echo -n "foo" >hoge1-11.txt
$ cat hoge1-11.txt | ./wc
0 1 3

演習1-12

#include <stdio.h>

#define IN  1
#define OUT 0

int main(int argc, char *argv[])
{
    int c, state;

    state = OUT;
    while ((c = getchar()) != EOF) {
        if (c == ' ' || c == '\n' || c == '\t') {
            state = OUT;
            putchar('\n');
        } else if (state == OUT) {
            state = IN;
            putchar(c);
        } else {
            putchar(c);
        }
    }

    return 0;
}

実行結果

$ cat hoge1-12.txt
the quick brown fox jumps over the lazy dog.
$ cat hoge1-12.txt | ./ex1-12
the
quick
brown
fox
jumps
over
the
lazy
dog.
$
プログラミング言語C 第2版 ANSI規格準拠
B.W. カーニハン D.M. リッチー
共立出版
売り上げランキング: 9726
«
»