最近在看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 EOFif(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 textbuf[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);}}
}