注释转换

利⽤C语⾔⽂件IO来实现C、C++源代码中注释内容的转换:C注释转换为C++⻛格的注释。

实现原理剖析:
这里写图片描述

这里写图片描述

具体代码如下:

convert_comment.h


#ifndef __CONVERT_COMMENT_H__
#define  __CONVERT_COMMENT_H__

#include <stdio.h>
#include <windows.h>

#define INPUTFILE "input.c"
#define OUTPUTFILE "output.c"

enum { NULLSTATUS, CSTATUS, CPPSTATUS, EOFSTATUS };





#endif  // __CONVERT_COMMENT_H__
convert_comment.c


#define _CRT_SECURE_NO_WARNINGS 1

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

#include "convert_comment.h"

int status = NULLSTATUS;

void do_null_status(FILE *ifp, FILE *ofp)//普通状态
{
    int c = fgetc(ifp);
    switch (c)
    {
    case '/':
    {
        int s = fgetc(ifp);
        switch (s)
        {
        case '*':
            fputc('/', ofp);
            fputc('/', ofp);
            status = CSTATUS;
            break;
        case '/':
            fputc('/', ofp);
            fputc('/', ofp);
            status = CPPSTATUS;
            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;
    }



}

void do_cpp_status(FILE *ifp, FILE *ofp)
{
    int c = fgetc(ifp);
    switch (c)
    {
    case '\n':
        fputc(c, ofp);
        status = NULLSTATUS;
        break;
    case EOF:
        status = EOFSTATUS;
        break;
    default:
        fputc(c, ofp);
        status =CPPSTATUS;
        break;
    }


}

void do_c_status(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(c, ofp);
        fputc('/', ofp);
        fputc('/', ofp);
        status = CSTATUS;
        break;
    case EOF:
        status = EOFSTATUS;
        break;
    default:
        fputc(c, ofp);
        status = CSTATUS;
        break;

    }

}


static void convert_work(FILE *ifp, FILE *ofp)
{
    while (status != EOFSTATUS)
    {
        switch (status)
        {
        case NULLSTATUS:
            do_null_status(ifp, ofp);
            break;
        case CPPSTATUS:
            do_cpp_status(ifp, ofp);
            break;
        case CSTATUS:
            do_c_status(ifp, ofp);
            break;
        case EOFSTATUS:
            break;
        default:
            break;
        }
    }
}


void connver_main()
{
    FILE *ifp = fopen(INPUTFILE, "r");
    FILE *ofp = fopen(OUTPUTFILE, "w");

    if (ifp == NULL || ofp == NULL)
    {
        fprintf(stderr,"this is fopen erro\n");
    }
    convert_work(ifp, ofp);

    fclose(ifp);
    fclose(ofp);
}
main.c

#define _CRT_SECURE_NO_WARNINGS 1


#include "convert_comment.h"

int main()
{
    connver_main();

    system("pause");
    return 0;
}

测试用例如下:
input.c

// 1.一般情况
int num = 0;
/* int i = 0; */

// 2.换行问题
/* int i = 0; */int j = 0;
/* int i = 0; */
int j = 0;

// 3.匹配问题
/*int i = 0;/*xxxxx*/

// 4.多行注释问题
/*
int i=0;
int j = 0;
int k = 0;
*/int k = 0;

// 5.连续注释问题
/*int a = 0;*//*int b = 0;*/

// 6.连续的**/问题
/***/

// 7.C++注释问题
// /*xxxxxxxxxxxx*/

相应的output.c

// 1.一般情况
int num = 0;
// int i = 0; 

// 2.换行问题
// int i = 0; 
int j = 0;
// int i = 0; 
int j = 0;

// 3.匹配问题
//int i = 0;/*xxxxx

// 4.多行注释问题
//
//int i=0;
//int j = 0;
//int k = 0;
//
int k = 0;

// 5.连续注释问题
//int a = 0;
//int b = 0;

// 6.连续的**/问题
//*

// 7.C++注释问题
// /*xxxxxxxxxxxx*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值