プログラミング言語 C

・ (ファイルを入力すると そのファイルの)バイト数、行数、単語数を表示する 有用なプログラムを考えてみよう。

・ ただし この場合の単語は「単に空白や改行やタブを含まない文字の連なり」と、アバウトに定義しておく。

・ このプログラムは UNIX のユーティリティプログラム(←コマンドのこと)"wc"の基幹となる部分である。(p23)

  1. /* primitive_wc.c */
  2. #include
  3. #define IN 1
  4. #define OUT 0
  5. /* IN,OUT は単語の状態(ステート)をあらわす */
  6. /* 単語の中 → 1, 単語の外 → 0 */
  7. main()
  8. {
  9. int c;
  10. int nc, nl, nw;
  11. int state;
  12. state = OUT;
  13. nc = nl = nw = 0;
  14. /* 各変数の初期化 */
  15. while ((c = getchar()) != EOF) {
  16. ++nc;
  17. /* バイト数をカウント */
  18. if (c == '\n') {
  19. ++nl;
  20. }
  21. /* 改行ごとに行数をカウント */
  22. if (c == ' ' || c == '\n' || c == '\t') {
  23. state = OUT;
  24. } else {
  25. if (state == OUT) {
  26. state = IN;
  27. ++nw;
  28. }
  29. }
  30. /* 1) 空白、改行、タブの場合には、ステートを 0 に変更 */
  31. /* 2) 入力した char が エスケープ文字ではなくて */
  32. /* 直前のステートが 0 の場合には、ステートを 1 に変更して */
  33. /* 単語数をカウント */
  34. }
  35. printf("char : %6d bytes\n", nc);
  36. printf("line : %6d lines\n", nl);
  37. printf("word : %6d words\n", nw);
  38. }

$./primitive_wc < primitive_wc.c として確認。
なんだか バイト数が1個多いような気が . .*1


(追記) コードの 最初の if文のカッコ*2が閉じてなかったので 訂正。

*1:'\0' ←これのセイかな ?

*2:コレ→ {}