注释转换项目精益版实现

本文介绍了一种通过文件操作将C语言注释风格转换为C++风格的方法。通过枚举不同注释状态并使用特定函数处理每种状态,实现了从C语言/*...*/到C++ //的平滑转换。

这道题对于新手来说,刚开始理解起来,确实有点难度。然而事实的真相却是相当简单,只要有一点字符操作经验的人都能够掌握。

不多说,进入正题:
我们的目标是将C语言中的注释转化为C++注释风格。
C注释风格: /**/
C++风格://
我们要采用文件操作来实现函数。
对一个文件我们要根据 “读”的字符,去判断他是哪一种风格。

/* 我们可以知道它是C注释风格了 函数中我们用C_STATE枚举常量表示,进行相应的C-》C++的转化
// 我们可以知道它是C++注释风格了 函数中我们用CPP_STATE枚举表示,进行C++的转化
其他的我们可以认为是正常字符 函数中我们用NORMAL_STATE枚举表示,进行C-》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*/

方便大家拷贝

首先头文件准备:
convert.h

#ifndef _COMMENT_CONVERT_H
#define _COMMENT_CONVERT_H

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

#define READFILENAME "input.txt"
#define WRITEFILENAME "output.txt"

//风格的几种状态进行编制
static enum STATE
{

    NORMAL_STATE,
    C_STATE,
    CPP_STATE,
    END_STATE,
};

void CommentConvert(FILE*fRead, FILE*fWrite);//转换函数
void Do_C_State(FILE*fRead, FILE*fWrite);//对C注释进行转换
void Do_Cpp_State(FILE*fRead, FILE*fWrite);//对C++注释进行转换
void Do_Normal_State(FILE*fRead, FILE*fWrite);//正常字符处理,以及风格分类


#endif

接下来,就是测试部分了,
test.c

#include"convert.h"
#pragma warning(disable:4996)
int main()
{

    printf("*******开始转换注释********\n\n\n");
    FILE*fRead = fopen(READFILENAME, "r");
    if (fRead == NULL)
    {
        perror("fopen");
        exit(EXIT_FAILURE);

    }
    FILE*fWrite = fopen(WRITEFILENAME, "w");
    if (NULL == fWrite)
    {
        perror("fopen");
        exit(EXIT_FAILURE);
    }
    CommentConvert(fRead, fWrite);
    printf("*******注释转换结束*****\n");
    fclose(fRead);
    fclose(fWrite);
    getchar();
    return 0;
}

最后各个函数实现部分
main.c

#include"convert.h"

enum STATE state = NORMAL_STATE;

void CommentConvert(FILE*fRead, FILE*fWrite)
{
    while (state != END_STATE)
    {
        switch (state)
        {
        case NORMAL_STATE:

            Do_Normal_State(fRead,fWrite);
            break;
        case C_STATE:

            Do_C_State(fRead, fWrite);
            break;
        case CPP_STATE:

            Do_Cpp_State(fRead, fWrite);
            break;

         default:
            break;

        }
    }
}

void Do_C_State(FILE*fRead, FILE*fWrite)
{
    char first = 0;
    char second = 0;
    char third = 0;

    first = fgetc(fRead);
    switch (first)
    {
    case'*':
        second = fgetc(fRead);
        switch (second)
        {
        case '/':
            third = fgetc(fRead);
            if (third != '\n')
            {
                fputc('\n', fWrite);
            }
            if (third=='/')
            {
                ungetc(third, fRead);
                state = NORMAL_STATE;
                break;
            }
            fputc(third, fWrite);
            state = NORMAL_STATE;
            break;
        case '*':
            third = fgetc(fRead);
            fputc(first, fWrite);
            if (third == '/')
            {
                state = NORMAL_STATE;
            }
            break;
        default:
            fputc(first, fWrite);
            fputc(second, fWrite);
            break;

        }
        break;
    case '\n':
        putc(first, fWrite);
        putc('/', fWrite);
        putc('/', fWrite);
        break;
    case EOF:
        state = END_STATE;
    default:

        fputc(first, fWrite);
        break;

    }
}

void Do_Cpp_State(FILE*fRead, FILE*fWrite)
{
    char first = 0;
    first = fgetc(fRead);
    switch (first)
    {
    case'\n':
        fputc(first, fWrite);
        state = NORMAL_STATE;
        break;
    case EOF:
        state = END_STATE;
        break;
    default:
        fputc(first, fWrite);
        break;

    }
}

void Do_Normal_State(FILE*fRead, FILE*fWrite)
{
    char first = 0;
    char second = 0;

    first = fgetc(fRead);
    switch (first)
    {
    case '/':
        second = fgetc(fRead);
        if (second == '*')
        {
            putc('/', fWrite);
            putc('/', fWrite);
            state = C_STATE;
        }
        else if (second == '/')
        {
            fputc(first, fWrite);
            fputc(second, fWrite);
            state = CPP_STATE;

        }
        else
        {

            fputc(first, fWrite);
            fputc(second, fWrite);
        }
        break;


    case EOF:
        state = END_STATE;

    default:
        fputc(first, fWrite);
        break;
    }

}

DOS结果:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值