C examples

最近在看David R. Hanson 的《C Interfaces and Implementations》,文中第一章提到了Literate Programming

作者举了一个例子: 

功能:用于检测输入中相邻且相同的单词

#include<stdio.h>
#include<math.h>
#include<errno.h>
#include<stdlib.h>
#include<ctype.h>
#include<string.h>

int linenum;

int getword(FILE *,char *,int);
void doubleword(char *,FILE *);

int main(int argc,char *argv[]){

  int i;
  for(i=1; i<argc; i++){
    FILE *fp=fopen(argv[i],"r");
    if(fp==NULL){
      fprintf(stderr,"%s: can't open '%s'(%s)\n",argv[0],argv[i],strerror(errno));
      return EXIT_FAILURE;
    }else{
       doubleword(argv[i],fp);
       fclose(fp);
    }
  }
  if(argc==1) doubleword(NULL,stdin);
  return EXIT_SUCCESS;
}

int getword(FILE *fp, char *buf, int size){

  int c;
  c=getc(fp);
  for(; c!=EOF && isspace(c); c=getc(fp)) //scan forword to a nonspace character or EOF
    if(c=='\n')
      linenum++;
    else{                //copy the word into buf[0……size-1]
      int i=0;
      for(: c!=EOF && !isspace(c); c=getc(fp))
        if(i<size-1)    //size means the max length of any word int the text
          buf[i++]=tolower(c);
      if(i<size)
        buf[i]='\0';
    }

  if(c!=EOF)
    ungetc(c,fp);
  return buf[0]!='\0';

}

void doubleword(char *name,FILE *fp){
   char prev[128],word[128];
   linenum=1;
   prev[0]='\0';
   while(getword(fp,word,sizeof(word))){
      if(isalpha(word[0])&& strcmp(prev,wortd)==0){
          if(name)
            printf("%s:",name);
          printf("%d:%s\n",linenum,word);

       }

    }
}

posted @ 2011-06-03 00:50  cpoint  阅读(343)  评论(2编辑  收藏  举报
浏览次数:travelocity promotion codes