プログラミング言語 C

(これから つくろうとする) 目的のプログラムの 全体の量は、いくつかの サポートルーティンを 与えることで、非常にコンパクトに できる。
主ルーティンでは 単に、関数 get_word により 単語を 読み込んで、add_tree の ルーティンで それを tree に 埋め込めばよい。

  1. #include
  2. #define MAX 100
  3. main()
  4. {
  5. struct Tnode *root;
  6. char word[MAX];
  7. root = NULL;
  8. while (get_word(word, MAX) != EOF)
  9. if (isalpha(word[0]) /* word の先頭が 英字であれば */
  10. root = add_tree(root, word);
  11. tree_print(root);
  12. return 0;
  13. }

関数 get_word では 入力から word を 取り込む。
ここでの word は 英字あるいは数字の文字列、または 空白ではない 1文字の いずれかを指す。
この関数の 返り値は word の 最初の文字 - 配列の 0 - あるいは ファイルの最後であれば EOF、アルファベット以外 (の文字) であれば その文字自体を 返す。
get_word は 関数 get_ch と unget_ch の ルーティンを 利用するので、英数字のトークンの 読み込みが 終了した時点では 1文字分 余計に 読んでいる。 そのため unget_ch を 呼び出して、次の 入力呼び出しに 備えて その文字を push back しておく。
関数 isspace を 使って スペースを スキップして (次に) 英字の区別を isalpha で 行い (最後に) isalnum によって 英字と数字との 区別を行っている。

  1. #include
  2. /* get_word : 入力から 次の word または 文字を求める */
  3. int get_word(char *word, int limit)
  4. {
  5. int c;
  6. int get_ch(void);
  7. void unget_ch(int);
  8. char *pw = word;
  9. while (isspace(c = get_ch()))
  10. ;
  11. if (c != EOF)
  12. *pw++ = c;
  13. if (!isalpha(c)) {
  14. *pw = '\0'; /* 文字列の終わり */
  15. return c;
  16. }
  17. for ( ; --limit > 0; pw++)
  18. if (!isalnum(*pw = get_ch())) {
  19. unget_ch(*pw);
  20. break;
  21. }
  22. *pw = '\0';
  23. return word[0];
  24. }

(p165-171)
(訂正) スペルミス と カッコを閉じるのを また忘れてた ...