#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define MAXWORD 10
#define NKEYS (sizeof keytab / sizeof keytab[0])
struct key
{
char *word;
int count;
}keytab[]={
{"auto",0},
{"break",0},
{"case",0},
{"char",0},
{"const",0},
{"continue",0},
{"defalut",0},
{"unsigned",0},
{"void",0},
{"volatile",0},
{"while",0}
};
int getword(char*, int);
int binsearch(char*, struct key*,int);
int getch1(void);
void ungetch1(int c);
int main(void)
{
int n;
char word[MAXWORD];
while (getword(word,MAXWORD) != EOF)
if (isalpha(word[0]))
if ((n = binsearch(word,keytab,NKEYS)) >= 0)
keytab[n].count++;
for (n = 0; n < NKEYS; n++)
if (keytab[n].count > 0)
printf("%4d %s\n",keytab[n].count,keytab[n].word);
return 0;
}
//binsearch函数:在tab[0]到tab[n-1]中查找单词
int binsearch(char*word, struct key tab[], int n)
{
int cond;
int low, high, mid;
low = 0;
high = n-1;
while (low <= high)
{
mid = (low + high) / 2;
if ((cond = strcmp(word, tab[mid].word)) < 0)
high = mid - 1;
else if (cond > 0)
low = mid + 1;
else
return mid;
}
return -1;
}
//getword函数:从输入中读取下一个单词或字符
int getword(char* word, int lim)
{
int c, getch1(void);
void ungetch1(int);
char *w = word;
while (isspace( c = getch1()))
;
if (c != EOF)
*w++ = c;
if (!isalpha(c))
{
*w = '\0';
return c;
}
for (; --lim > 0; w++)
if ( !isalnum( *w = getch1()))
{
// printf("in the getword()");
ungetch1(*w);
break;
}
*w = '\0';
return word[0];
}
#define BUFSIZE 100
char buf[BUFSIZE];
int bufp = 0;
int getch1(void)
{
return (bufp > 0) ?buf[--bufp] : getchar();
}
void ungetch1(int c)
{
if (bufp >= BUFSIZE)
printf("ungetch: too many characters\n");
else
buf[bufp++] = c;
}