C语言----注释转换(C风格---C++风格)

这篇博客主要内容是注释转换, 就是把C语言风格的注释/* ~~~~~~~~~~*/转换成C++风格 //

其中有一些文件操作函数,不懂的可以看这篇博客:
https://blog.csdn.net/abc_xixi111/article/details/80377450

首先,我们要知道一个文件中至少有五种状态,我们用状态图表示
注释状态图

解读:
我们从 不是注释 的状态开始,请看下图
这里写图片描述

有以下几种情况需要注意:

/* ~~~  */   转变成     //~~~

/* ~~        转变成     //~~
~~                     //~~
~~ */ ~~~~             //~~
                        ~~~~
判断是否为换行,如果换行需要输入//

/*~~~~~~~**/   转变成     //~~~~~~~~~*

如果准备出注释的时候,遇到*先保留看下一个字符是不是/,如果是/,在判断下一个字符是不是换行,不是换行就输入一个换行,就到下一行

下面是input.c,是一个测试文件。

// 1.一般情况
/* 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.连续注释问题
/**//**/

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

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

源文件注释转换.c

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef enum state{
    NO_ZHUSHI,
    REDAY_GO,
    C_COM,
    CPP_COM,
    REDAY_OUT
} State;
int main()
{
    FILE *pIn = fopen("input.c", "r");//以读方式打开文件
    assert(pIn != NULL);

    FILE *pOut = fopen("output.c", "w");//以写方式打开文件
    assert(pOut != NULL);

    int ch, nextch;
    State state = NO_ZHUSHI;//开始状态为 不是注释

    while (1)
    {
        ch = fgetc(pIn);
        if (ch == EOF)
            break;
        switch (state)
        {
        case NO_ZHUSHI:
            if (ch == '/'){
                fputc(ch, pOut);
                state = REDAY_GO;
            }
            else
            {
                fputc(ch, pOut);
                state = NO_ZHUSHI;
            }
            break;
        case REDAY_GO:
            if (ch == '/'){
                fputc(ch, pOut);
                state = CPP_COM;
            }
            else if (ch = '*'){
                fputc('/', pOut);
                state = C_COM;
            }
            else{
                fputc(ch, pOut);
                state = NO_ZHUSHI;
            }
            break;
        case CPP_COM:
            if (ch == '\n')
            {
                fputc(ch, pOut);
                state = NO_ZHUSHI;
            }
            else
            {
                fputc(ch, pOut);
                state = CPP_COM;
            }
            break;
        case C_COM:
            if (ch == '*')
            {
                state = REDAY_OUT;
            }
            else
            {
                if (ch == '\n'){
                    fputc("/", pOut);
                    fputc("/", pOut);
                }
                state = C_COM;
            }
            break;
        case REDAY_OUT:
            if (ch == '/')
            {
                nextch = fgetc(pIn);
                if (nextch != '\n')
                {
                    fputc('\n', pOut);
                }
                ungetc(nextch, pIn);
                state = NO_ZHUSHI;
            }
            else if (ch == '*')
            {
                fputc('*', pOut);
                state = REDAY_OUT;
            }
            else
            {
                fputc('*', pOut);
                fputc(ch, pOut);
                state = C_COM;
            }
            break;
        }
    }
    fclose(pOut);
    fclose(pIn);

    system("pause");
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值