积累系统性知识
积聚技术精华
  首页    个人中心    撰写积文    建立课题    订立目标    整理积文    管理课题    管理目标    技能Get    代码积累 
C/C++代码整理源代码
error997 (error997)    2014-11-20 20:31:14      目标    课题
   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);2000

  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/article/details/1376105
(+0)技能Get

建议楼主:搜索关键字 |参考其他