注释转换

注释转换:

题目描述:

给定一段代码,其中有c语言的注释风格,也有c++的注释风格,要求将c语言的注释风格转换为c++的注释风格,属于c++注释风格的不转换,剩余其他原样输出。

题目分析如下图:


                              

需要的函数:首先我们需要3种状态和一个切换状态的函数,

1.空状态void Do_NUL_State(),即既不属于c状态也不属于c++状态

2.c状态void Do_C_State(),需要将/*x*/,转换为//x;;

3.c++状态,即属于c++注释风格的不变

void Do_CPP_State();

4;切换函数void ConmentConvert(),用于切换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;
// 5.连续注释问题
/**//**/


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


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

头文件部分:

#define _CRT_SECURE_NO_WARNINGS 1

#ifndef __CONMENTCONVERT_H
#define __CONMENTCONVERT_H

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
 
#define INPUTFILENAME "input.c"
#define OUTPUTFILENAME "output.c"



enum STATE
{
NUL_STATE,
C_STATE,
CPP_STATE,
END_STATE

};



void ConmentConvert(FILE *pfRead,FILE *pfWrite);
void Do_NUL_State(FILE *pfRead,FILE *pfWrite);
void Do_C_State(FILE *pfRead,FILE *pfWrite);
void Do_CPP_State(FILE *pfRead,FILE *pfWrite);
#endif
主函数部分:
<span style="color:#6600cc;">#include"ConmentConvert.h"  
int main()  
{  
    FILE *pfread=NULL;  
    FILE *pfwrite=NULL;  
    printf("转化开始\n");  
    pfread=fopen(INPUTFILENAME,"r");  
    if(NULL == pfread)  
    {  
        perror("open file for read\n");  
        exit(EXIT_FAILURE);  
    }  
    pfwrite=fopen(OUTPUTFILENAME,"w");  
    if(NULL == pfwrite)  
    {  
        fclose(pfread);  
        perror("open file for write\n");  
        exit(EXIT_FAILURE);  
    }  
    ConmentConvert(pfread,pfwrite);  
    printf("转化结束\n");  
	system("pause");
	return 0;
}  </span>
函数实现部分:

<pre name="code" class="cpp"><span style="font-size:18px;color:#ff0000;"><strong>#define _CRT_SECURE_NO_WARNINGS 1

#include"conmentconvert.h"

enum STATE state=NUL_STATE;
int frist=0;
	int second=0;
	int third=0;
void Do_NUL_State(FILE *pfRead,FILE *pfWrite)
{
	frist=fgetc(pfRead);
	switch(frist)
	{
	case '/':
		second=fgetc(pfRead);
		if(second=='*')
		{
			fputc('/',pfWrite);
			fputc('/',pfWrite);
			state=C_STATE;
		}

		else if(second=='/')
		{
			fputc(frist,pfWrite);
			fputc(second,pfWrite);
			state=CPP_STATE;
		}
		else//其他字符直接输出
		{
			fputc(frist,pfWrite);
			fputc(second,pfWrite);
		}
		break;
	case EOF://文件结束标志
     state=END_STATE;
	 break;
	default:
fputc(frist,pfWrite);//处理不是注释的字符
break;
	}
}

void Do_C_State(FILE *pfRead,FILE *pfWrite)
{
	frist=fgetc(pfRead);
	switch(frist)
	{
	case '*':
		second=fgetc(pfRead);  
        switch(second)  
        {  
        case '*':                  //   6.连续的/***/问题  
            third=fgetc(pfRead);  
            fputc(frist,pfWrite);  
            if(third == '/')      
            {  
                state=NUL_STATE;
            }  
            break;  
        case '/':  
            third=fgetc(pfRead);  
           if(third == '/')       //5.连续的注释问题/**//**/  
            {  
                ungetc('/',pfRead);  
                state=NUL_STATE;  
                break;  
		   }
		   else
		   {
            fputc(third,pfWrite);   //   /* int i = 0; */ \n int j = 0;  
            state=NUL_STATE;   
            break; 
		   }
        default:                   //不是注释的字符  
            fputc(frist,pfWrite);  
            fputc(second,pfWrite);  
            break;  
        }  
        break;  
    case '\n':   
		 fputc('\n',pfWrite);          //4.C注释中的多行注释   
        fputc('/',pfWrite);  
        fputc('/',pfWrite);
        break;  
	case EOF:
		state=END_STATE;
		break;
	default:
		fputc(frist,pfWrite);
		break;
	}
}

void Do_CPP_State(FILE *pfRead,FILE *pfWrite)
{
	frist=fgetc(pfRead);
	switch(frist)
	{
	case '\n':
		fputc(frist,pfWrite);
		state=NUL_STATE;
		break;
	case EOF:
		state=END_STATE;  
        break;  
	default:
		fputc(frist,pfWrite);  
		break;
	}
}


void ConmentConvert(FILE *pfRead,FILE *pfWrite)
{
	while(state != END_STATE)
	{
		switch(state)
		{
		case NUL_STATE:
			Do_NUL_State(pfRead,pfWrite);
			break;
		case C_STATE:
			Do_C_State(pfRead,pfWrite);
			break;
		case CPP_STATE:
			Do_CPP_State(pfRead,pfWrite);
			break;
		case END_STATE:
			break;
		default:
			break;
		}
	}
}</strong></span>


 




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值