资料收集站

SDL

Monday
Jan 05th
Text size
  • Increase font size
  • Default font size
  • Decrease font size

C语言代码美化


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

Comments (3)Add Comment
0
...
written by 访客, February 10, 2006
不懂
0
晕。
written by 访客, February 27, 2006
真是,写完了。也来个提示性的说明嘛。
0
天涯孤行
written by 访客, March 01, 2006
刚刚下载哦,还没有看类,用过在说把

Write comment

busy
Last Updated ( Friday, 10 February 2006 04:45 )  

Google 搜索

在线用户

We have 127 guests online