注释转换

  1. 列表内容

功能思想:
1)注释分为两种:c 语言注释和 c++ 注释
2)文本状态分为四种:

普通状态(即NULLSTATUS)
C++状态(即CPPSTATUS)
C 状态(即CSTATUS)
EOF状态(即EOFSTATUS)

3)四种状态关系图

这里写图片描述

具体实现:

  1. 普通状态 —– C 状态(或C++ 状态)

    /* int i = 0; */
    // 1.一般情况
    进入普通状态,读取字符,当读到 ‘/ ’ 时,进行判断下一个字符,如果是 ‘ * ’ (或 ‘ / ’),则表示这是C 状态的注释(或C++状态),进入到C状态(或C++ 状态)再进行判断

  2. C 状态(或C ++ 状态) —— 普通状态

    由状态图可知,进入C状态(或C++状态)后,回到普通状态由标志 ‘ * / ’(或 ‘ \ n ’)决定,当遇到标志后方可回到普通状态。但需要注意的是:C状态下的结束标志为 ‘ */ ’

  3. 普通状态(C/C++ 状态)——EOF状态

    EOF即文件的结束标志,故当普通状态(C/C++ 状态)遇到EOF时,就进入EOF状态

  4. 多行注释问题

    /*
    int i=0;
    int j = 0;
    int k = 0;
    */int k = 0;
    分析:遇到‘ /* ’进入C状态,进行注释转换,但每行存在换行;当遇到换行符时,需输出换行符,换行到下一行,并且输出 ‘ // ’ 来保证注释正确

代码实现:

convert.h

#ifndef __CONVERT_H__
#define __CONVERT_H__

#include<stdio.h>
#include<stdlib.h>



enum
{
    NULLSTATUS,
    CPPSTATUS,
    CSTATUS,
    EOFSTATUS

};



void  convert_test();
void convert_work(FILE *ifp, FILE *ofp);




#endif // !__CONVERT_H__

convert.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"convert.h"

int status = NULLSTATUS;


//普通状态
void do_nullstatus(FILE *ifp, FILE *ofp)
{
    int  c = fgetc(ifp);
    switch (c)
    {
    case '/':
    {
                int s = fgetc(ifp);
                switch (s)
                {
                case '/':

                    fputc('/', ofp);
                    fputc('/', ofp);


                    status = CPPSTATUS;
                    break;
                case '*':
                    fputc('/', ofp);
                    fputc('/', ofp);

                    status = CSTATUS;

                    break;
                case  EOF:

                    status = EOFSTATUS;

                    break;
                default:

                    fputc(c, ofp);

                    ungetc(s, ifp);

                    status = NULLSTATUS;

                    break;
                }
    }
        break;
    case EOF:
        status = EOFSTATUS;
        break;
    default:
        fputc(c, ofp);
        status = NULLSTATUS;
        break;
    }
}
//c++ 状态
void do_cppstatus(FILE *ifp, FILE *ofp)
{
    int c = fgetc(ifp);
    if (c == '\n')
    {
        fputc(c, ofp);
        status = NULLSTATUS;
    }
    else if (c == EOF)
    {
        status = EOFSTATUS;
    }
    else
    {
        fputc(c, ofp);
        status = CPPSTATUS;
    }


}

//c状态
void do_cstatus(FILE *ifp, FILE *ofp)
{
    int c = fgetc(ifp);
    switch (c)
    {
    case '*':
    {
                int s = fgetc(ifp);
                switch (s)
                {
                case '/':

                    fputc('\n', ofp);

                    status = NULLSTATUS;

                    break;
                case EOF:

                    status = EOFSTATUS;

                    break;
                default:

                    fputc(c, ofp);

                    ungetc(s, ifp);

                    status = CSTATUS;

                    break;
                }
    }
        break;
    case '\n':

        fputc('\n', ofp);

        fputc('/', ofp);
        fputc('/', ofp);

        status = CSTATUS;
        break;
    case EOF:

        status = EOFSTATUS;

        break;
    default:

        fputc(c, ofp);

        status = CSTATUS;

        break;
    }

}



void convert_work(FILE *ifp,FILE *ofp)
{
    while (status != EOFSTATUS)
    {
        switch (status)
        {
        case NULLSTATUS:
            do_nullstatus(ifp, ofp);
            break;
        case CPPSTATUS:
            do_cppstatus(ifp, ofp);
            break;
        case CSTATUS:
            do_cstatus(ifp, ofp);
            break;
        case EOFSTATUS:
            break;
        default:
            break;
        }

    }


}



void  convert_test()
{
    FILE *ifp;
    FILE *ofp;

    ifp = fopen("input.c", "r");
    ofp = fopen("output.c", "w");

    if (ifp == NULL || ofp == NULL)
    {
        perror("Error  open");
        exit(EXIT_FAILURE);
    }

    convert_work(ifp, ofp);

    fclose(ifp);
    fclose(ofp);
}

test.c

#include<stdio.h>
#include"convert.h"

int main()
{
    convert_test();
    return 0;
}

测试结果:

这里写图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值