#include <stdio.h> #include <ctype.h> #include <string.h> #define NKEYS (sizeof keytab / sizeof(struct key)) struct key { char *word; int count; }; /*關鍵字列表(注意一定要按字典排序)*/ struct key keytab[15] = { "abort",0, "break",0, "clock",0, "define",0, "echo",0, "fgetc",0, "get",0, "help",0, "insert",0, "jump",0, "kind",0, "long",0, "malloc",0, "null",0, "operate",0 }; int binarysearch(char *word, struct key tab[], int n); int getword(char *word); /*<The C programming language (second edition) 中的小練習> 功能:統計輸入文本中關鍵字出現的次數。 */ int main() { char word[30]; int n; while(getword(word) != 0 && strcmp(word,"quit") != 0) { if((n = binarysearch(word,keytab,NKEYS )) >= 0); keytab[n].count++; } for(n = 0; n < NKEYS; n++) { if(keytab[n].count > 0) printf("%s : %d\n",keytab[n].word,keytab[n].count); } return 0; } /*從輸入端得到一個單詞*/ int getword(char *word) { char c; int i = 0; while(isspace(c = getchar())) ; while(1) { if(c != '\n' && c != ' ' && c != '\t' && isalpha(c)) word[i++] = c; if(c == '\n' || c == ' ' ) { word[i] = '\0'; return i; } c = getchar(); } return i; } /*binarysearch 函數: 在tab[0]到tab[n]中查找單詞*/ int binarysearch(char *word, struct key tab[], int n) { int mid,l,h,flag; l= 0; h = n - 1; while(l <= h) { mid = (l + h)/2; if( (flag = strcmp(word,tab[mid].word)) < 0) h = mid - 1; else if(flag > 0) l = mid + 1; else return mid; } return -1; }