注释符转换(C++ -> C)

本文介绍了一个简单的C/C++源代码注释转换工具,该工具能够将C风格的注释转换为特定的标记形式,以方便进一步处理或分析。文章详细展示了工具的实现过程,包括状态机的设计和具体的转换逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写过很多代码,但也是苦于低头苦干,代码的风格和能里还是需要迫切需要提高,所以在老师的提醒下学着写写博客,还希望高手们不吝赐教
一些封装还没来得及做,只是啰里啰嗦的把程序代码写完


//主函数
#include<iostream>
using namespace std;
extern "C" int ConvertComment(FILE *inputfile, FILE *outputfile);


int main(int argc, char *argv[])
{
    FILE *fpIn = NULL;
    FILE *fpOut = NULL;
    fpIn = fopen("input.c", "r");
    if(fpIn == NULL)
    {
        cout<<"Open input.c file Fail."<<endl;
        return -1;
    }
    fpOut = fopen("output.c","w");
    if(fpOut == NULL)
    {
        cout<<"Open output.c file Fail."<<endl;
        return -1;
    }


    ConvertComment(fpIn, fpOut);


    fclose(fpIn);
    fclose(fpOut);


    cout<<"注释转换完成......"<<endl;
}
/********************************************************************
在字符串里出现/* 或*-/前面没有/* (星杠)会被@@代替
存在的问题:
1、连串的/最后一个会保留
2、单独/ 和连续的 * 会保留
3、出现** / 无法改变
*******************************************************************/
#include<iostream>
using namespace std;


extern "C" int ConvertComment(FILE *inputfile, FILE *outputfile);

//状态定义
typedef enum
{
    NO_COMMENT_STATE,//无注释状态
    C_COMMENT_STATE,//C语言状态
    CPP_COMMENT_STATE,//c++状态
    STRING_COMMENT_STATE,//字符串状态
    END_STATE//结束状态
}ENUM_STATE;


typedef struct StateMachine
{
    FILE *inputfile;
    FILE *outputfile;
    ENUM_STATE state;
}StateMachine;

StateMachine g_state;


int i = 0;//计数一行遇见的“个数
int n = 0;//计数一行遇见的'个数
///////不考虑程序人员语法错误时候开始转换
int  j = 0;//计数/*的个数,直到遇到第一个*/的时候将其置零,中途遇到的所有// /*  都会被替换成空格
//申明各个函数
void EventPro(char ch);
void EventProAtNo(char ch);
void EventProAtC(char ch);
void EventProAtCpp(char ch);
void EventProAtString(char ch);
void _Count_Comment(char ch,char ch1);
/////////////////////////////////////////////////////


int ConvertComment(FILE *inputfile, FILE *outputfile)
{
    if(inputfile==NULL || outputfile==NULL)
    {
        cout<<"argument is invalid."<<endl;
        return -1;
    }


//////////////////////////////////////////////////
//初始化结构体变量
    g_state.inputfile = inputfile;//读文件操作
    g_state.outputfile = outputfile;//写文件操作
    g_state.state = NO_COMMENT_STATE;//初始状态


    char ch;
    while(g_state.state != END_STATE)
    {
        ch = fgetc(g_state.inputfile);
        EventPro(ch);
    }


    return 0;
}


void EventPro(char ch)
{
    switch(g_state.state)
    {
        case NO_COMMENT_STATE:
            EventProAtNo(ch);
            break;
        case C_COMMENT_STATE:
            EventProAtC(ch);
            break;
        case CPP_COMMENT_STATE:
            EventProAtCpp(ch);
            break;
        case STRING_COMMENT_STATE:
            EventProAtString(ch);
            break;
    }
}



void EventProAtNo(char ch)
{
    char nextch;
    switch(ch)
    {
        case  39:
            ++n;
            fputc(ch,g_state.outputfile );
            g_state.state = STRING_COMMENT_STATE;
            break;
        case '"':
            ++i;
            fputc(ch,g_state.outputfile );
            g_state.state = STRING_COMMENT_STATE;
            break;
        case EOF:
            if(j!=0)
            {
                fputc('*',g_state.outputfile );
                fputc('/',g_state.outputfile );
                j=0;
            }
            g_state.state = END_STATE;
            break;
        case '/':
            nextch = fgetc(g_state.inputfile);
            if(nextch == '/'|| nextch == '*') // C++////////////////////
            {
                _Count_Comment(ch,nextch);
            }
            else
            {
                if(nextch=='"'||nextch==39)
                {
                    if(nextch == '"')
                        ++i;
                    else
                        ++n;
                    g_state.state = STRING_COMMENT_STATE;
                }
                fputc(ch,g_state.outputfile );
                fputc(nextch,g_state.outputfile );
            }
            break;
        case '*':
            nextch = fgetc(g_state.inputfile);
            if(nextch == '/') 
            {
                if(j==0)
                {
                    fputc(' ',g_state.outputfile);
                    fputc(' ',g_state.outputfile);
                }
                else
                {
                    fputc('*',g_state.outputfile);
                    fputc('/',g_state.outputfile);
                    j=0;
                }
            }
            else
            {
                if(nextch=='"'||nextch==39)
                {
                    if(nextch == '"')
                        ++i;
                    else
                        ++n;
                    g_state.state = STRING_COMMENT_STATE;
                }
                fputc(ch,g_state.outputfile);
                fputc(nextch,g_state.outputfile);
            } 
            break;
        default :
            fputc(ch,g_state.outputfile);
            break;
    }
}


void EventProAtC(char ch)
{
    char nextch;
    switch(ch)
    {
        case '/':
           nextch = fgetc(g_state.inputfile);
           if(nextch == '/'||nextch == '*') 
           {
             _Count_Comment(ch,nextch);
           }
           else
           {
                fputc(ch,g_state.outputfile);
                fputc(nextch,g_state.outputfile);
           }
            break;
        case '*':
            nextch = fgetc(g_state.inputfile);
            if(nextch!='*'&&nextch!='/')
            {
                fputc(ch,g_state.outputfile );
                fputc(nextch,g_state.outputfile );
            }
            if(nextch=='*'||nextch=='/')
            {
                if(nextch=='/')
                {
                    fputc(ch,g_state.outputfile );
                    fputc('*',g_state.outputfile);
                    fputc('/',g_state.outputfile);
                    j=0;
                    g_state.state = NO_COMMENT_STATE;
                }
                else
                {
                    fputc(ch,g_state.outputfile);
                    ch=nextch;
                    EventProAtC(ch);
                }
            }
        //fputc(nextch,g_state.inputfile);
        /*
            nextch = fgetc(g_state.inputfile);
            if(nextch == '/') 
            {
                if(j==0)
                {
                    fputc(' ',g_state.outputfile);
                    fputc(' ',g_state.outputfile);
                }
                else
                {
                    fputc('*',g_state.outputfile);
                    fputc('/',g_state.outputfile);
                    j=0;
                    g_state.state = NO_COMMENT_STATE;
                }
            }
            else if(nextch=='*')
            {
                fputc(ch,g_state.outputfile);
                char nextch1=fgetc(g_state.inputfile );
                if(nextch1=='/')
                j=0;
                fputc(nextch,g_state.outputfile);
                fputc(nextch1,g_state.outputfile );

            }
            else
            {
                fputc(ch,g_state.outputfile);
                fputc(nextch,g_state.outputfile);
            }*/
        break;
        case EOF:
            if(j==1)
            {
                fputc('*',g_state.outputfile);
                fputc('/',g_state.outputfile);
                j=0;
            }
           g_state.state = END_STATE;
           break;
       default:
           fputc(ch,g_state.outputfile);
           break;
    }
}
void EventProAtCpp(char ch)
{
    char nextch;
    switch(ch)
    {
        case '\n':
            if(j!=0)
            {
                fputc('*',g_state.outputfile );
                fputc('/',g_state.outputfile );
                j=0;
                g_state.state = NO_COMMENT_STATE;
            }
            fputc(ch,g_state.outputfile);
            break;
        case '/':
            nextch = fgetc(g_state.inputfile);
            if(nextch == '*'||nextch=='/') 
            {
                _Count_Comment(ch,nextch);
            }
            else
            {
                if(nextch==39||nextch=='"')
                {
                    if(nextch==39)
                    ++n;
                    else
                    ++i;
                    g_state.state =STRING_COMMENT_STATE;
                }
                fputc(ch,g_state.outputfile );
                fputc(nextch,g_state.outputfile );
            }
            break;
        case '*':
            nextch = fgetc(g_state.inputfile);
            if(nextch == '/') 
            {
                fputc(' ',g_state.outputfile);
                fputc(' ',g_state.outputfile);
            }


            break;
        case '"':
            ++i;
            fputc(ch,g_state.outputfile);
            g_state.state = STRING_COMMENT_STATE;
            break;
        case 39:
            ++n;
             fputc(ch,g_state.outputfile);
            g_state.state = STRING_COMMENT_STATE;
            break;
        case EOF:
            if(j!=0)
            {
                fputc('*',g_state.outputfile);
                fputc('/',g_state.outputfile);
                j=0;
            }
            g_state.state = END_STATE;
            break;
        default:
            fputc(ch,g_state.outputfile);
            break;
    }
}


//字符串状态处理函数
void EventProAtString(char ch)//在这里不改变j的值
{
    char nextch;
    char nextch1;
    switch(ch)
    {
        case '"':
        ++i;
        fputc(ch,g_state.outputfile);
        if(i%2==0)
        {
            nextch = fgetc(g_state.inputfile);
            if(nextch=='/')
            {
                nextch1 = fgetc(g_state.inputfile);
                if(nextch1 == '/'||'*')
                {
                    _Count_Comment(nextch,nextch1);
                }
                else
                {
                    if(nextch1==39||nextch1=='"')
                    {
                        if(nextch1==39)
                            ++n;
                        else
                            ++i;
                    }
                    else
                        g_state.state = NO_COMMENT_STATE;
                    fputc(nextch,g_state.outputfile);
                    fputc(nextch1,g_state.outputfile);
                }
            }
            else if(nextch=='*')
            {
                nextch1 = fgetc(g_state.inputfile);
                if(nextch1 == '/')
                {
                    if(j!=0)
                    {
                        fputc(nextch,g_state.outputfile );
                        fputc(nextch1,g_state.outputfile );
                        j=0;
                    }
                    else 
                    {
                        fputc(' ',g_state.outputfile );
                        fputc(' ',g_state.outputfile );
                    }
                    g_state.state = NO_COMMENT_STATE;
                }
                else
                {
                    if(nextch1==39||nextch1=='"')
                    {
                        if(nextch1==39)
                            ++n;
                        else
                            ++i;
                    }
                    else
                        g_state.state = NO_COMMENT_STATE;
                    fputc(nextch,g_state.outputfile);
                    fputc(nextch1,g_state.outputfile);
                }
            }
            else if(nextch == EOF)
            {
                if(j!=0)
                {
                    fputc('*',g_state.outputfile );
                    fputc('/',g_state.outputfile );
                    j=0;
                }
                g_state.state = END_STATE;
            }
            else
            {
                fputc(nextch,g_state.outputfile );
                if(nextch=='"'||nextch==39)
                {
                    if(nextch == '"')
                        ++i;
                    else
                        ++n;
                    g_state.state = STRING_COMMENT_STATE;
                }
                else
                    g_state.state = NO_COMMENT_STATE;
            }
        }
        break;
    case 39:
        ++n;
        fputc(ch,g_state.outputfile);
        if(n%2==0)
        {
            nextch = fgetc(g_state.inputfile);
            if(nextch=='/')
            {
                nextch1 = fgetc(g_state.inputfile);
                if(nextch1 == '/'||'*')
                {
                    _Count_Comment(nextch,nextch1);
                }
                else
                {
                    fputc(nextch,g_state.outputfile );
                    fputc(nextch1,g_state.outputfile );
                    if(nextch1=='"'||nextch1==39)
                    {
                        if(nextch1 == '"')
                            ++i;
                        else
                            ++n;
                        g_state.state = STRING_COMMENT_STATE;
                    }
                    else
                        g_state.state = NO_COMMENT_STATE;
                }
            }
            else if(nextch=='*')
            {
                nextch1 = fgetc(g_state.inputfile);
                if(nextch1 == '/')
                {
                    if(j!=0)
                    {
                        fputc(nextch,g_state.outputfile );
                        fputc(nextch1,g_state.outputfile );
                        j=0;
                    }
                    else 
                    {
                        fputc(' ',g_state.outputfile );
                        fputc(' ',g_state.outputfile );
                    }
                    g_state.state = NO_COMMENT_STATE;
                }
                else
                {
                    fputc(nextch,g_state.outputfile);
                    fputc(nextch1,g_state.outputfile);
                    if(nextch1=='"'||nextch1==39)
                    {
                        if(nextch1 == '"')
                            ++i;
                        else
                            ++n;
                        g_state.state = STRING_COMMENT_STATE;
                    }
                    else
                        g_state.state = NO_COMMENT_STATE;
                }
            }
            else if(nextch=='\n')
            {
                if(j!=0)
                {
                    fputc('*',g_state.outputfile);
                    fputc('/',g_state.outputfile);
                    j=0;
                }
                fputc(nextch,g_state.outputfile );
                g_state.state = NO_COMMENT_STATE;    
            }
            else if(nextch == EOF)
            {
                if(j!=0)
                {
                    fputc('*',g_state.outputfile );
                    fputc('/',g_state.outputfile );
                    j=0;
                }
                g_state.state = END_STATE;
            }
            else
            {
                fputc(nextch,g_state.outputfile );
                if(nextch=='"'||nextch==39)
                {
                    if(nextch == '"')
                        ++i;
                    else
                        ++n;
                    g_state.state = STRING_COMMENT_STATE;
                }
                else
                    g_state.state = NO_COMMENT_STATE;
            }
        }
        break;
    case '\n':
        fputc(ch,g_state.outputfile );
        i=0;
        n=0;
        g_state.state = NO_COMMENT_STATE;
        break;
    default :
        if(i%2==0&&i!=0||n%2==0&&n!=0)//防止嵌套的引号出现
        {
            if(ch=='*')
            {
                nextch = fgetc(g_state.inputfile);
                if(nextch  ==  '/'||j!=0)
                {
                    fputc('@',g_state.outputfile );
                    fputc('@',g_state.outputfile );
                }
                else 
                {
                    if(nextch==39||nextch=='"')
                    {
                        if(nextch == 39)
                            ++n;
                        else
                            ++i;
                    }
                    fputc(ch,g_state.outputfile );
                    fputc(nextch,g_state.outputfile );
                }
            }
            else
            {
                fputc(ch,g_state.outputfile);
                g_state.state = NO_COMMENT_STATE;
            }
        }
        else
            if(ch == '*')
            {
                char nextch = fgetc(g_state.inputfile );
                if(nextch == '/'&&j!=0)
                {
                    fputc('@',g_state.outputfile );
                    fputc('@',g_state.outputfile );
                }
                else
                {
                    fputc(ch,g_state.outputfile );
                    fputc(nextch,g_state.outputfile );
                }
            }
            else
                fputc(ch,g_state.outputfile);
            break;
    }
}
//内部使用函数,用于处理c和c++下面遇到的//和/*
void _Count_Comment(char ch1,char ch2)
{
    switch(ch2)
    {
        case '/':
            if(j == 0)
            {
                char nextch3 = fgetc(g_state.inputfile);
                if(nextch3=='\n')
                {
                    fputc(' ',g_state.outputfile);
                    fputc(' ',g_state.outputfile);
                    g_state.state = CPP_COMMENT_STATE;
                }
                else
                {
                    fputc('/',g_state.outputfile);
                    fputc('*',g_state.outputfile);
                    ++j;
                    g_state.state =CPP_COMMENT_STATE;
                }
                fputc(nextch3,g_state.outputfile);
            }
            else
            {
                fputc(' ',g_state.outputfile);
                fputc(' ',g_state.outputfile);
            }
            break;
        case '*':
            if(j == 0)
            {
                fputc('/',g_state.outputfile);
                fputc('*',g_state.outputfile);
                ++j;
                g_state.state = C_COMMENT_STATE;
            }
            else
            {
               fputc(' ',g_state.outputfile);
                fputc(' ',g_state.outputfile);
            }
        break;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值