最近在看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); } } }