实现c语言注释转换为c++注释

这篇文章将实现 c语言注释转换为c++注释

例如,将下面的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*/

#自定义头文件部分

#ifndef __COMMENTCONVERT_H__
#define __COMMENTCONVERT_H__

#define _CRT_SECURE_NO_WARNINGS 1
#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 

#函数功能实现部分

#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);//从input.c文件中读取一个字符
    switch(first)
    {
    case '/':
        {
            fputc(first,pfout);//将第一个字符输出到output.c文件中
            second = fgetc(pfin);//读取下一个字符
            switch(second)
            {
            case '*'://如果是“/*”就将‘*’改为‘/’放入output.c中
                fputc('/',pfout);
                *sta = C_START;//进入c语言注释转换函数中
                break;
            case '/'://如果是“//”,将second输出到output.c文件中
                fputc(second,pfout);
                *sta = Cpp_START;//进入c++注释转换函数中
                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,pfin);//将*之后的内容放到缓存区
                break;
            case '/':
                {
                    int third = fgetc(pfin);//判断第三个字符是不是“\n”解决这种注释问题:/* int i = 0; */int j = 0;
                    *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 sta = NULL_START;
    while(sta!=END_START)
    {
        switch(sta)
        {
        case NULL_START:
            DoNullState(pfin, pfout, &sta);//普通字符转换函数
            break;
        case C_START:
            DoCState(pfin, pfout, &sta);//c语言注释转换为c++注释函数
            break;
        case Cpp_START:
            DoCppState(pfin, pfout, &sta);//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;
}

#结果
output.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*/
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值