作者:Y___Y 联系:yinwei_88@sina.com
对于程序员来说,经常需要到网上查找资料,尤其是源代码,但往往由于网页排版或者其他的原因,导致copy下来的代码有时会相当的乱,手工整理需要花大量的时间,把时间花在这些无聊的工作上,无疑是对宝贵的时间的巨大浪费。笔者深受其苦,而且笔者也不喜欢用其他的辅助工具,所以花了点时间,编了一个C++源代码整理工具。大家可以任意修改,以达到更好的效果和更多的选择。 本源码可以任意使用和传播。
以下是纯C风格的源程序,http://yyhlm.ys168.com提供VC,BCB,纯C++的源代码下载。
#include <stdio.h> #include <string.h> //去字符串首尾空格 void RemoveSpace(char str[]) { int i=0,len=strlen(str); char Des[1024]="",*p=str,*q=str+len-1; while(*p!='\0') { if(*p==' '||*p==9)p++; else break; } while(q>str) { if(*q==' '||*q==9)q--; else break; } while(p<=q) Des[i++]=*(p++); Des[i]='\0'; strcpy(str,Des); } //字符串首部加n个空格 void AddSpace(int n,char str[]) { int i,len=strlen(str); if(len==0) return; str[len+n]='\0'; for(i=len-1;i>=0;i--) { str[i+n]=str[i]; } for(i=0;i<n;i++) { str[i]=' '; } } //读一行数据 void ReadLine(FILE *fp,char str[]) { int i=0; unsigned char c; while(!feof(fp)&&i<1024) { fscanf(fp,"%c",&c); if(c==10)break; str[i++]=c; } str[i]='\0'; } //写一行数据 void WriteLine(FILE *fp,char str[]) { fprintf(fp,"%s%c",str,10); } //判断指针是否包含在双引号内 int IsInDouQuo(char *p,char *str) { char *p1=str,*p2; if(p==0||str==0) return 0; while(*p1!='\0') { p1=strchr(p1,34); if(p1==0) return 0; p2=strchr(p1+1,34); if(p2==0) return 0; if(p>p1&&p<p2) return 1; p1=p2+1; } return 0; } //判断指针是否包含在C风格注释内 int IsInCommentC(char *p,char *str) { char *p1=str,*p2; if(p==0||str==0) return 0; while(p1) { p1=strstr(p1,"/*"); if(p1==0) return 0; if(IsInDouQuo(p1,str)) continue; p2=strstr(p1,"*/"); if(p>p1&&p<p2||p>p1&&p2==0) return 1; if(p2==0) return 0; p1=p2+1; } return 0; } //判断指针是否包含在注释内 int IsInComment(char *p,char *str) { char *p1=str; if(p==0||str==0) return 0; p1=strstr(str,"//"); if(p1&&IsInDouQuo(p1,str)==0&&p>p1) return 1; return IsInCommentC(p,str); } //寻找子字符串 char *FindSub(char *p,char sub[]) { int i=0; char *pr=p; if(*pr=='{'||*pr=='}')pr++; while(*pr!='\0') { if((*pr=='{'||*pr=='}')&&IsInDouQuo(pr,p)==0&&IsInComment(pr,p)==0&&p[0]!='#')break; sub[i++]=*pr; pr++; } sub[i]='\0'; return pr; }
//截取不含空格的子字符串 char *CutSub(char *p,char sub[]) { int i=0; char *pr=p; while(*pr!='\0') { if(*pr!=' '&&*pr!=9||IsInDouQuo(pr,p)==1)break; pr++; } while(*pr!='\0') { if((*pr==' '||*pr==9)&&IsInDouQuo(pr,p)==0)break; sub[i++]=*pr; pr++; } sub[i]='\0'; return pr; } //判断是不是case语句 int IsCase(char str[]) { char *p; p=strstr(str,"case "); if(p==str) return 1; p=strstr(str,"default:"); if(p==str) return 1; return 0; } //改变一行风格 //可以自己重写需要的风格(这里只是将行中多余的空格删除) void SetStyle(char str[],int nChange) { char Des[1024],sub[1024],*p=str; Des[0]='\0'; if(nChange==0)//不删除的情况 return; while(*p!='\0') { p=CutSub(p,sub); strcat(Des,sub); strcat(Des," "); } Des[strlen(Des)-1]='\0'; strcpy(str,Des); } //行尾冒号是否退格 int SpaceBack(char str[]) { if(str[0]=='#') return 0; char *p=str+strlen(str); while(p>str) { if(*p=='/'&&p-1>=str&&*(p-1)=='/'&&IsInDouQuo(p,str)==0) break; p--; } if(p>str) p=p-2; while(p>str) { if(*p==' '||*p==9)p--; else break; } if(p==str&&str[strlen(str)-1]==':'&&IsCase(str)==0&&IsInCommentC(str+strlen(str)-1,str)==0) return 1; if(p>=str&&*p==':'&&IsCase(str)==0) return 1; return 0; } //整理代码 //in----输入的文件 //out---输出的文件 //nTab--行首的基本空格数 void CleanUp(FILE *in,FILE *out,int nTab) { int i,dep=0;//dep表示符号"{"与符号"}"之差且dep恒大于0 char str[1024],sub[1024],*p; while(!feof(in)) { ReadLine(in,str);//读一行数据 if(strlen(str)==0)//空行的情况 { fprintf(out,"%c",10); continue; } //下面将读入的一行数据分解为子行,最终输出的是子行 p=str; while(*p!='\0') { if(*p=='{') { for(i=0;i<dep*nTab;i++) fprintf(out,"%c",' '); fprintf(out,"%c%c",*p,10); dep++; } if(*p=='}'&&dep>0) { for(i=0;i<(dep-1)*nTab;i++) fprintf(out,"%c",' '); if(*(p+1)==';') { fprintf(out,"%c%c%c",*p,';',10); p=p+2; } else fprintf(out,"%c%c",*p,10); dep--; } p=FindSub(p,sub); RemoveSpace(sub); if(strlen(sub)==0) continue; SetStyle(sub,1);//风格设置 if(SpaceBack(sub)&&dep>0) AddSpace((dep-1)*nTab,sub);//行尾冒号退一格 else AddSpace(dep*nTab,sub); WriteLine(out,sub);//写入子行 } } } //写一行数据 int main() { FILE *fp,*out; fp=fopen("in.txt","r"); out=fopen("out.txt","w"); if(!fp) { printf("文件打开失败!"); return 0; } if(!out) { printf("文件打开失败!"); return 0; } CleanUp(fp,out,4);
fclose(fp); fclose(out); return 0; } 转载自:http://blog.csdn.net/y___y/archive/2006/11/09/1376105.aspx |