プログラミング言語 C
・ (ファイルを入力すると そのファイルの)バイト数、行数、単語数を表示する 有用なプログラムを考えてみよう。
・ ただし この場合の単語は「単に空白や改行やタブを含まない文字の連なり」と、アバウトに定義しておく。
・ このプログラムは UNIX のユーティリティプログラム(←コマンドのこと)"wc"の基幹となる部分である。(p23)
- /* primitive_wc.c */
- #include
- #define IN 1
- #define OUT 0
- /* IN,OUT は単語の状態(ステート)をあらわす */
- /* 単語の中 → 1, 単語の外 → 0 */
- main()
- {
- int c;
- int nc, nl, nw;
- int state;
- state = OUT;
- nc = nl = nw = 0;
- /* 各変数の初期化 */
- while ((c = getchar()) != EOF) {
- ++nc;
- /* バイト数をカウント */
- if (c == '\n') {
- ++nl;
- }
- /* 改行ごとに行数をカウント */
- if (c == ' ' || c == '\n' || c == '\t') {
- state = OUT;
- } else {
- if (state == OUT) {
- state = IN;
- ++nw;
- }
- }
- /* 1) 空白、改行、タブの場合には、ステートを 0 に変更 */
- /* 2) 入力した char が エスケープ文字ではなくて */
- /* 直前のステートが 0 の場合には、ステートを 1 に変更して */
- /* 単語数をカウント */
- }
- printf("char : %6d bytes\n", nc);
- printf("line : %6d lines\n", nl);
- printf("word : %6d words\n", nw);
- }
$./primitive_wc < primitive_wc.c として確認。
なんだか バイト数が1個多いような気が . .*1
(追記) コードの 最初の if文のカッコ*2が閉じてなかったので 訂正。