注释转换

编写一个小项目将一个一个文件中的注释都转换成C++的注释风格
设计部分:
(1)头文件模块:包括模块中需要引用的头文件定义,需要实现的主要函数的声明
(2)头文件中主要函数模块的实现:各个函数部分实现的细节
(3)测试函数:检验函数模块的功能
(4)写入一个输入文件
(5)运行结果记入一个输出文件中
可能遇到的多种情况

原始输入部分(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*/  
//头文件模块  
#ifndef __COMMENTCONVERT_H__  
#define __COMMENTCONVERT_H__  

#include <stdio.h>  
#include <stdlib.h>  
#define INPUT "input.c"  
#define OUTPUT "output.c"  


enum KIND           //定义一个枚举常量来表示要执行的选项的操作  
{  
    END_START,                    
    NULL_START,  
    C_START,  
    Cpp_START,  
};  

void CommentConvert(FILE *pfin, FILE *pfout);                   //注释转换操作函数  
void DoNullState(FILE *pfin, FILE *pfout,enum KIND *sta);       //普通字符转换函数  
void DoCState(FILE *pfin, FILE *pfout,enum KIND *sta);          //c语言注释转换为c++注释函数  
void DoCppState(FILE *pfin, FILE *pfout,enum KIND *sta);        //c++注释转换函数  


#endif      //__COMMENTCONVERT_H__  
#define _CRT_SECURE_NO_WARNINGS 1  
//函数具体功能实现模块实现  
#include"CommentConvert.h"  

void DoNullState(FILE *pfin, FILE *pfout,enum KIND *sta)        //普通字符转换函数  
{  
    int first=0;  
    int second=0;  
    first=fgetc(pfin);  
    switch(first)  
    {  
    case '/':  
        {  
            fputc(first,pfout);  
            second = fgetc(pfin);  
            switch(second)  
            {  
            case '/':       //如果是//将second输出,进入c++注释部分  
                fputc(second,pfout);  
                *sta = Cpp_START;  
                break;  
            case '*':       //如果是/*就将*改为/输出,进入c注释部分  
                fputc('/',pfout);  
                *sta = C_START;       
                break;  
            default:  
                fputc(second,pfout);  
                break;  
            }  
            break;  
    case EOF:           //文件结束  
        fputc(first,pfout);  
        *sta=END_START;  
        break;  
    default:            //其他字符  
        fputc(first,pfout);  
        break;  
        }  
    }  
}  


void DoCState(FILE *pfin, FILE *pfout,enum KIND *sta)           //c语言注释转换为c++注释函数  
{  
    int first = 0;  
    int second = 0;  
    first=fgetc(pfin);  
    switch(first)  
    {  
    case '/':  
        fputc(first,pfout);  
        break;  
    case '*':  
        {  
            second=fgetc(pfin);  
            switch(second)  
            {  
            case '*':  
                fputc(first,pfout);  
                ungetc(second,pfout);      //将*之后的内容放到缓存区  
                break;  
            case '/':  
            {  
                int third=fgetc(pfin);  
                *sta=NULL_START;  
                if(third == '\n') //判断注释之后是否需要主动换行的情况  
                {  
                    fputc('\n',pfout);  
                }  
                else  
                {  
                    fputc('\n',pfout);  
                    ungetc(third,pfin);  
                }  
            }  
            break;  
        default:  
            fputc(first,pfout);  
            fputc(second,pfout);  
            break;  
            }  
        }  
        break;  
    case '\n':  
        second=fgetc(pfin);  
        switch(second)  
        {  
        case '*':  
            {  
                int third=fgetc(pfin);  
                if(third == '/')  
                {  
                    fputc('\n',pfout);  
                    *sta = NULL_START;  
                }  
                else  
                {  
                    fputc('/',pfout);  
                    fputc('/',pfout);  
                    fputc(second,pfout);  
                    fputc(third,pfout);  
                }  
                break;  
            }  
        default:  
            fputc('\n',pfout);  
            fputc('/',pfout);  
            fputc('/',pfout);  
            ungetc(second,pfin);  
            break;  
        }  
        break;  
    default:  
        fputc(first,pfout);  
        break;  
    }  
}  

void DoCppState(FILE *pfin, FILE *pfout,enum KIND *sta)         //c++注释转换函数  
{  
    int first = 0;  
    first = fgetc(pfin);  
    switch(first)  
    {  
    case '\n':  
        fputc(first,pfout);  
        *sta = NULL_START;  
        break;  
    default:  
        fputc(first,pfout);  
        break;  
    }  
}  


void CommentConvert(FILE *pfin, FILE *pfout)                     //注释转换操作函数  

{  
    int input=0;  
    int output=0;  
    enum KIND str = NULL_START;  

    while(str!=END_START)  
    {  
        switch(str)  
        {  
        case NULL_START:  
            DoNullState(pfin, pfout, &str);  
            break;  
        case C_START:  
            DoCState(pfin, pfout, &str);  
            break;  
            case Cpp_START:  
            DoCppState(pfin, pfout, &str);//c++注释转换函数  
            break;  
        case END_START:  
            break;  
        default:  
            break;  
        }  
    }  
    printf("转换成功!\n");  
    fclose(pfin);  
    fclose(pfout);  
}  
#define _CRT_SECURE_NO_WARNINGS 1  
//测试模块部分  
#include <stdio.h>  
#include <stdlib.h>  
#include"CommentConvert.h"  

int main()  
{  
    FILE *pfout = NULL;  
    FILE *pfin = NULL;  
    pfin = fopen(INPUT,"r");                //以读的形式打开文件  
    if(pfin == NULL)  
    {  
        perror("not open file");  
        exit(EXIT_FAILURE);  
    }  
    pfout=fopen(OUTPUT,"w");                //写入文件  
    if(pfout == NULL)  
    {  
        perror("not open file");  
        fclose(pfin);  
        exit(EXIT_FAILURE);  
    }  
    CommentConvert(pfin,pfout);             //注释转换操作函数  
    system("pause");  
    return 0;  
}  
//转换成功部分(outpu.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  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值