将C语言注释转换为c++注释

要求

int a = 10;
// 1.一般情况
int num = 0;
/* 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.连续注释问题
/int a=0;//int b=0;/

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

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

分析

分析图

代码片

头文件

#ifndef __COMMENTCONVERT_HEADFILE__   
#define __COMMENTCONVERT_HEADFILE__

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>

 enum STATE    
{
NUL,
C,
CPP,
END
};

void CommentConvert(FILE *pfin, FILE * pfout);
void DoNULConvert(FILE *pfin, FILE * pfout, enum STATE * state);  
void DoCConvert(FILE *pfin, FILE * pfout, enum STATE * state);
void DoCPPConvert(FILE *pfin, FILE * pfout, enum STATE * state);

#endif 

源文件

#include"标头.h"
#define  _CRT_SECURE_NO_WARNINGS 1
#include  <stdio.h>
#include <string.h>
#include <stdlib.h>


void CommentConvert(FILE *pfin, FILE * pfout)
{
    enum STATE state = NUL;//初始化状态 为   无注释状态  
    while (state != END)
    {
        switch (state)
        {
        case NUL: 
        {
                     DoNULConvert(pfin, pfout, &state);
        }
            break;
        case C:
        {
                   DoCConvert(pfin, pfout, &state);
        }
            break;
        case CPP: 
        {
                     DoCPPConvert(pfin, pfout, &state);
        }
            break;
        default:
            break;
        }
    }
}

void DoNULConvert(FILE *pfin, FILE * pfout, enum STATE * state)
{
    int start = 0;
    int next = 0;
    start = fgetc(pfin);
    switch (start)
    {
    case '/':  
    {
                 next = fgetc(pfin);  
                 switch (next)
                 {
                 case '*':// 表示进入C语言注释状态  
                 {
                              fputc('/', pfout);                              
                              fputc('/', pfout);
                              *state = C;//状态转换为  C注释状态  
                 }
                     break;
                 case '/':// 表示进入C++注释状态  
                 {
                              fputc(start, pfout);  
                              fputc(next, pfout);
                              *state = CPP;  //状态转换为  C++注释状态  
                 }
                     break;
                 default:   
                 {
                                fputc(start, pfout);  
                                fputc(next, pfout);
                 }
                     break;
                 }
    }
        break;
    case EOF: 
    {

                 fputc(start, pfout);  
                 *state = END;
    }
        break;
    default://表示遇到的不是注释  ,状态不变   
    {
                fputc(start, pfout); //将读取的字符输出到文件  
    }
        break;
    }
}
//c状态转换  
void DoCConvert(FILE *pfin, FILE * pfout, enum STATE * state)
{
    int start = 0;
    int next = 0;
    int then = 0;
    start = fgetc(pfin);
    switch (start)
    {
    case '*'://遇到'*'表示C语言注释状态   
    {
                 next = fgetc(pfin);    
                 switch (next) 
                 {
                 case '/': 
                 {
                              then = fgetc(pfin);   
                              if (then == '\n')
                              {
                                  fputc(then, pfout);  
                              }
                              else
                              {
                                  fputc('\n', pfout);
                                  ungetc(then, pfin); 
                              }
                              *state = NUL;
                 }
                     break;
                 default:
                 {
                            fputc(start, pfout);
                            ungetc(next, pfin);   
                 }
                     break;
                 }
    }
        break;

    case '\n': 
    {
        fputc(start, pfout);
        fputc('/', pfout);
        fputc('/', pfout);

    }
        break;
    default:
        fputc(start, pfout); 
        break;
    }
}
//c++状态转换
void DoCPPConvert(FILE *pfin, FILE * pfout, enum STATE * state)
{
    int start = 0;
    int next = 0;
    int then = 0;
    start = fgetc(pfin);  
    switch (start)
    {
    case '\n':  
    {
                  fputc(start, pfout);
                  *state = NUL;
    }
        break;
    default:
        fputc(start, pfout);
        break;
    }
}

测试文件


#include "标头.h"

int main()
{
    FILE *pfin = NULL;
    FILE *pfout = NULL;
    pfin = fopen("input.c", "r");
    if (pfin == NULL)
    {
        perror("input file open:");
        exit(EXIT_FAILURE);
    }
    pfout = fopen("output.c", "w");
    if (pfout == NULL)
    {
        perror("output file open:");
        fclose(pfin);
        exit(EXIT_FAILURE);
    }
    CommentConvert(pfin, pfout);
    printf("注释转换成功\n");
    fclose(pfin);
    fclose(pfout);
    system("pause");
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值