c注释向c++注释的转换

在c语言中支持嵌套注释,而c++语言不支持

c注释风格:/*  */

c++注释风格://

那么如何将c注释转换为c++注释呢?




大致有以下情况:       

1.单行注释/* int i=0;*/                            

2./* int j=0;*/int k=0;/* int m=0;*/

int n=0;
3.

/* int a=0;/*xxxx*/

4.多行注释

/*
int b=0;
int c=0;
int d=0;
*/int e=0;
5./**//**/
6./****/
7.// /*xxxxxxx*/

源代码如下:

#ifndef _COMMENT_CONVERT_H__
#define _COMMENT_CONVERT_H__
#include
   
   
    
    
#include
    
    
     
     

#define INFILE_NAME  "input.c"
#define OUTFILE_NAME  "output.c"
typedef enum Status//枚举类型定义四种状态
{
	No_Status,
	C_Status,
    Cpp_Status,
	END
}Status;
void DoConvertWork(FILE* pfin,FILE* pfout);//无注释状态
void DoNo_Convert(Status* ps,FILE* pfin,FILE* pfout);//结束状态
void DoC_Convert(Status* ps,FILE* pfin,FILE* pfout);//c注释状态
void DoCpp_Convert(Status* ps,FILE* pfin,FILE* pfout);//c++注释状态
#endif  //_COMMENT_CONVERT_H__
    
    
   
   
#include "commentconvert.h"
void DoConvertWork(FILE* pfin,FILE* pfout)//转换工作
{
	Status status=No_Status;//无状态
	while(status!=END)
	{
		switch(status)
		{
		case No_Status:
			DoNo_Convert(&status,pfin,pfout);
			break;
		case C_Status:
			DoC_Convert(&status,pfin,pfout);
			break;
		case Cpp_Status:
            DoCpp_Convert(&status,pfin,pfout);
			break;
		default :
			break;
       }
	}
	exit(1);
}
void DoNo_Convert(Status* ps,FILE* pfin,FILE* pfout)//无状态
{
	int first=fgetc(pfin);//获取文件中的首字符
	switch(first)
	{
	case '/':
		{
			int second=fgetc(pfin);//获取第二个字符
			switch(second)
			{
			    case '/'://遇到//转c++状态
                    *ps=Cpp_Status;
					break;
			    case '*'://遇到/*转c注释状态
                    fputc('/',pfout);// 输出时加上/
					fputc('/',pfout);
					*ps=C_Status;、
					break;
				default:
					fputc('/',pfout);//输出/
					fputc(second,pfout);//输出字符
					*ps=No_Status;
					}
		}
		break;
	case EOF://EOF为文件结束标志
        *ps=END;
		break;
	default:
		fputc(first,pfout);
		*ps=No_Status;
		break;
	}
}
void DoC_Convert(Status* ps,FILE* pfin,FILE* pfout)
{
	int first=fgetc(pfin);
	switch(first)
	{
	case '*':
		{
			int second=fgetc(pfin);
			switch(second)
			{
			 case '*':
				ungetc('*',pfin);//  /**第二个*为文件中的字符,而非注释符,将其换回读出的文件
                fputc(second,pfout);
                *ps=C_Status;
				break;
			 case '/':
				 fputc('\n',pfout);
                *ps=No_Status;
				break;
			 default:
				fputc('*',pfout);
				fputc(second,pfout);
				*ps=C_Status;
				break;
            }
		}
		break;
	case '\n':
		{
		  fputc('\n',pfout);
		  fputc('/',pfout);
		  fputc('/',pfout);
		  *ps=C_Status;
		}
        break;
	case '/':
		{
			int second=fgetc(pfin);
			switch(second)
			{
			case '*':
				fputc('/',pfout);
				fputc('/',pfout);
                *ps=C_Status;
				break;
			case '/':
				fputc('/',pfout);
				fputc('/',pfout);
				*ps=Cpp_Status;
				break;
			default :
				fputc('/',pfout);
				fputc(second,pfout);
				*ps=C_Status;
             }
		}
		break;
	default:
		fputc(first,pfout);
        *ps=C_Status;
     }
}
void DoCpp_Convert(Status* ps,FILE* pfin,FILE* pfout)
{
	int first=fgetc(pfin);
	switch(first)
	{
	case '/':
		{
			int second=fgetc(pfin);
			switch(second)
			{
			  case '*':
				  fputc('/',pfout);
				  fputc('/',pfout);
                  *ps=C_Status;
				break;
			 default :
                  *ps=Cpp_Status;
				  break;
             }
		break;
		}
	case EOF:
		*ps=END;
		break;
	case '\n':
        fputc('/n',pfout);
        *ps=No_Status;
		break;
	default:
		fputc(first,pfout);
        *ps=Cpp_Status;
		break;
	}
}
#define _CRT_SECURE_NO_WARNINGS 1
#include "commentconvert.h"

void test()
{
    FILE *pfin=NULL;
    FILE *pfout=NULL;
	pfin=fopen(INFILE_NAME,"r");
	if(pfin==NULL)
	{
		perror("open file for read");
		exit(1);
	}
    pfout=fopen(OUTFILE_NAME,"w");
	if(pfout==NULL)
	{
        perror("open file for write");
		fclose(pfin);
		exit(1);
	}
	DoConvertWork(pfin,pfout);
	fclose(pfin);
	fclose(pfout);
}
int main()
{   
	test();
    return 0;
}

执行结果如下:
// int i=0;

// int j=0;
int k=0;
// int m=0;

int n=0;
// int a=0;//xxxx

//
//int b=0;
//int c=0;
//int d=0;
//
int e=0;
//
//

//**

 //xxxxxxx







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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值