c的代码,如果你写代码时没有养成良好的习惯,可能你的代码很难清楚的阅读。这里我写了一个简单的代码排版工具,它可以对c的代码进行缩进。
由于它只考虑{、}的出现数量,所以功能有限。它不能帮你查错,但经过修改它也许可以把程序中的留白也转为标准的格式。这样,等你发布你的代码时,人们就可以看到整洁而清楚的代码了。
程序中考虑到注释、字符串、字符中的'{''}'可能出现的情况,把扫描代码的过程划分为不同的状态,只有在代码中出现的{}才考虑对缩进的影响。
#include#include #define EOF_REACHED 0 #define READ_OK 1 #define EOF_LINE 2 //各种状态: #define CODE 0 // c code #define QUOTE 1 // " " #define SLASHinQUOTE 2 // " \? " #define QUOTE2 3 // ' ' #define SLASH 4 // / #define LINEQ 5 // // #define PARAQ 6 // /**/ char strl[128]; char * check(char str[],char tar) { register int i=0,c; static int status=CODE; do { c=str[i]; //状态转化表: switch(c) { case '\"': switch(status) { case CODE: status=QUOTE; break; case SLASHinQUOTE: status=CODE; break; case QUOTE: status=CODE; break; } break; case '\\': switch(status) { case QUOTE: status=SLASHinQUOTE; break; } break; case '\n': switch(status) { case LINEQ: status=CODE; break; } break; case '\'': switch(status) { case CODE: status=QUOTE2; break; case QUOTE2: status=CODE; break; } break; case '/': switch(status) { case CODE: status=SLASH; break; case SLASH: status=LINEQ; break; case PARAQ: status=CODE; break; } break; case '*': switch(status) { case SLASH: status=PARAQ; break; } break; default: switch(status) { case SLASH: status=CODE; break; } } if(c==tar&&status==CODE) return str+i; i++; } while(c); return NULL; } int readln(FILE *fp) { int i=0,j=0; register int c; while(!feof(fp)) { c=fgetc(fp); strl[i]=c; if(c!=' '&&c!='\t') j=1; i+=j; if(c=='\n') { strl[i]='\0'; return READ_OK; } } if(i) { strl[i-1]='\n'; strl[i]='\0'; return EOF_LINE; } else return EOF_REACHED; } void main(int argc,char **argv) { FILE *infp,*outfp; char fn[64]; char *p; int magin,j; if(argc==1) { printf("C Program beautifier\n"); printf("by kensta 2002.9.12\n"); printf("Type the c file:"); scanf("%s",fn); infp=fopen(fn,"rt"); } else { infp=fopen(argv[1],"rt"); } if(infp==NULL) { printf("File open error.\n"); return; } outfp=fopen("temp.c","w"); if(outfp==NULL) { printf("Can not create file.\n"); return; } while(readln(infp)!=EOF_REACHED) { p=check(strl,'}'); if(p!=NULL) { magin--; fprintf(outfp,"\n"); } for(j=0;j BookmarkEmail thisHits: 6255Comments (3)
Write comment




