プログラミング言語 C
(これから つくろうとする) 目的のプログラムの 全体の量は、いくつかの サポートルーティンを 与えることで、非常にコンパクトに できる。
主ルーティンでは 単に、関数 get_word により 単語を 読み込んで、add_tree の ルーティンで それを tree に 埋め込めばよい。
- #include
- #define MAX 100
- main()
- {
- struct Tnode *root;
- char word[MAX];
- root = NULL;
- while (get_word(word, MAX) != EOF)
- if (isalpha(word[0]) /* word の先頭が 英字であれば */
- root = add_tree(root, word);
- tree_print(root);
- return 0;
- }
関数 get_word では 入力から word を 取り込む。
ここでの word は 英字あるいは数字の文字列、または 空白ではない 1文字の いずれかを指す。
この関数の 返り値は word の 最初の文字 - 配列の 0 - あるいは ファイルの最後であれば EOF、アルファベット以外 (の文字) であれば その文字自体を 返す。
get_word は 関数 get_ch と unget_ch の ルーティンを 利用するので、英数字のトークンの 読み込みが 終了した時点では 1文字分 余計に 読んでいる。 そのため unget_ch を 呼び出して、次の 入力呼び出しに 備えて その文字を push back しておく。
関数 isspace を 使って スペースを スキップして (次に) 英字の区別を isalpha で 行い (最後に) isalnum によって 英字と数字との 区別を行っている。
- #include
- /* get_word : 入力から 次の word または 文字を求める */
- int get_word(char *word, int limit)
- {
- int c;
- int get_ch(void);
- void unget_ch(int);
- char *pw = word;
- while (isspace(c = get_ch()))
- ;
- if (c != EOF)
- *pw++ = c;
- if (!isalpha(c)) {
- *pw = '\0'; /* 文字列の終わり */
- return c;
- }
- for ( ; --limit > 0; pw++)
- if (!isalnum(*pw = get_ch())) {
- unget_ch(*pw);
- break;
- }
- *pw = '\0';
- return word[0];
- }
(p165-171)
(訂正) スペルミス と カッコを閉じるのを また忘れてた ...