注释转换(c语言注释转为c++注释)

在我们的C/C++的项⽬目当中会有C、C++两种注释⻛风格,有时为了方便,会将注释全部转为同一种,我这里做的是将c语言风格注释转为c++注释; 
c注释为:/int i=1;
c++注释为://int i=1; 
因为在注释转换中有很多情况需要考虑周全,所以可通过下图的梳理来一步步实现代码 
注释状态转换图
接下来就是代码部分,首先是头文件“convert.h”

#ifndef __CONVERT_H__
#define __CONVERT_H__
#include<stdio.h>
#include<stdlib.h>

enum { NULSTAT, CSTAT, CPPSTAT, EOFSTAT };//分别定义四种状态:无注释状态,c注释,c++注释,文件结束状态

#define INPUT "input.c"//定义输入文件
#define OUTPUT "output.c"//定义输出文件

static void convert_work(FILE *ipf, FILE *opf);//定义两个指针分别指向文件内容
void do_null_stat(FILE*ipf, FILE*opf);//无注释状态
void do_cpp_stat(FILE*ipf, FILE*opf);//c++状态
void do_c_stat(FILE *ipf, FILE *opf);//c状态
void convert_main();//测试函数

#endif __CONVERT_H__
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

源文件”convert.c”:

#define _CRT_SECURE_NO_WARNINGS 1
#include"convert.h"

static int status = NULSTAT;

void do_null_stat(FILE*ipf, FILE*opf)//无注释状态
{
    int c = fgetc(ipf);//从input.c中取一个字符,进行判断
    switch (c)
    {
    case'/'://进入注释状态
    {
                int s = fgetc(ipf);//取c的下一个字符,判断
                switch (s)
                {
                case'*':   //  表示"/*" ,c语言注释状态,改为c++状态
                    fputc('/', opf);
                    fputc('/', opf);
                    status = CSTAT;
                    break;
                case'/':  //   表示"//",c++状态
                    fputc('/', opf);
                    fputc('/', opf);
                    status = CPPSTAT;
                    break;
                default: //表示'/'是字符,输出c、s
                    fputc(c, opf);
                    fputc(s, opf);
                    status = NULSTAT;
                    break;
                }
    }break;
    case EOF: //遇到文件结束状态,输出字符
        fputc(c, opf);
        status = EOFSTAT;
    default:
        fputc(c, opf);
        break;
    }
}

void do_c_stat(FILE *ipf, FILE *opf)//c注释状态
{
    int c = fgetc(ipf);
    switch (c)
    {
    case'*': //c注释状态,判断下一个字符
    {
         int s = fgetc(ipf);
         switch (s)
            {
              case'/':  //c语言注释状态结束,判断后面的字符是不是换行符
               {
                    int r = fgetc(ipf);//再取一个字符
                    if (r == '\n')
                     {
                         fputc(r, opf);//是换行符则输出字符
                     }
                    else
                    fputc('\n', opf);//不是,则添加一个换行符,并将r字符退回去
                    ungetc(r, ipf);// ungetc功能是把一个或多个字符退回输入流中,不能是输出流
                    status = NULSTAT;
                    break;
               default:
                   fputc(c, opf);
                   ungetc(s, ipf);
                   break;
               }
               }
    }break;
    case'\n'://  换行之后加上 // ,因为c++只能注释一行
        fputc(c, opf);
        fputc('/', opf);
        fputc('/', opf);
        break;
    default:
        fputc(c, opf);
        break;
        }
}

void do_cpp_stat(FILE*ipf, FILE*opf)  //c++注释状态
{
    int c = fgetc(ipf);
    switch (c)
    {
    case'\n':  //表示一行注释结束,输出字符,到无注释状态

        fputc(c, opf);
        status = NULSTAT;
    default:
        fputc(c, opf);
        break;
    }
}

static void convert_work(FILE *ipf, FILE *opf)//工作状态,根据不同情况进行选择
{
    while (status != EOFSTAT)
    {
        switch (status)
        {
        case NULSTAT:
            do_null_stat(ipf, opf);
            break;
        case CPPSTAT:
            do_cpp_stat(ipf, opf);
            break;
        case CSTAT:
            do_c_stat(ipf, opf);
            break;
        default:
            printf("ERROR!!!");
            break;
        }
    }
}

void convert_main()//写入输入文件,并判断是否为空
{
    FILE *ipf = NULL;
    FILE *opf = NULL;
    ipf = fopen("input.c", "r");//打开读取文件
    if (ipf == NULL)//若文件为空
    {
        perror("input file open: ");//读取文件失败
        exit(EXIT_FAILURE); //EXIT_FAILURE是"stdlib.h"头文件中定义的一个符号常量,表示执行一个程序失败,EXIT_SUCCESS表示执行一个程序成功;二者均可作为exit()的参数使用
    }
    opf = fopen("output.c", "w");//打开输出文件
    if (opf == NULL)
    {
        perror("output file open: ");
        fclose(ipf);
        exit(EXIT_FAILURE);
    }
    convert_work(ipf, opf);
    fprintf(opf, "%s\n");
    printf("转换成功\n");
    fclose(ipf);//关闭两个文件
    fclose(opf);
}
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141

主函数main()

#define _CRT_SECURE_NO_WARNINGS 1
#include"convert.h"
int main()
{
    convert_main();
    return 0;
}
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

以上就是我所实现的代码程序,接下来可写入输入文件input.c

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

// 2. 换行问题 
/* int i = 0; */int j = 0; 
/* int i = 0; */ 
int m = 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*/ 
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

接下来就是执行程序,成功后可在文件资源管理器中查看输出文件”output.c”,看输出结果是否符合预期,下面是我的输出文件:

// 1. 一般情况 

int num = 0; 
// int i = 0; 


// 2. 换行问题 

// int i = 0; 
int j = 0; 
// int i = 0; 

int m = 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*/ 

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

可见是符合转换要求的。 
在写程序的过程中最需要注意的是细节!细节!细节!细节!细节!………… 
重要的事说上不止三遍

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值