K&R的名著:<C程序设计语言>小程序总结p117统计关键字

#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;
   
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值