C/C++代码整理源代码
作者: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;
}
962

被折叠的 条评论
为什么被折叠?



