注释转换 (将C注释转换为C++注释)

注释转换 

注释转换 》  就是将代码中的注释转换为同一类的  , 比如是 C 语言 或者C++ 
C语言中  ,编译器默认的注释风格是    /*  .........*/   
C++中  ,编译器默认的注释风格是  // .......      注释一行  
要将 注释转化为  一致
这是一个很大的工程 ,因为你要将  其中的坑都要  考虑全面  。情况所有的j问题 都要解决。 
否则 ,得到的代码会是 很乱 的。
下面是我自己画的   不同注释的转换关系  》》》

下面是 
常见的一些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*/
要想做到 ,就要做到精益求精 ,将所有情况都考虑好    。
我已经做到了  ,相信 你也不例外  奋斗
代码附录
~~~~~~~~~~~头文件   .h~~~~~~~~~~~~~~~
#pragma  once//表示头文件被调用一次

#include <stdio.h>
#include <stdlib.h>


enum STATE //定义一个枚举类型  表示   此时代码的状态
{
	NUL,//无注释状态 
	C,//C语言注释状态
	CPP,//C++注释状态
	END//代码结束状态
};
//执行转换函数
void CommentConvert(FILE *pfin,FILE * pfout);//pfin 表示的是要读取的文件 ,pfout表示转换后输出的文件
//无状态转换
void DoNULConvert(FILE *pfin,FILE * pfout,enum STATE * state);
//c状态转换
void DoCConvert(FILE *pfin,FILE * pfout,enum STATE * state);
//c++状态转换
void DoCPPConvert(FILE *pfin,FILE * pfout,enum STATE * state);
~~~~~~~~~~源文件  .c~~~~~~~~~~~~
#define  _CRT_SECURE_NO_WARNINGS 

#include  "CommentConvert.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://状态为C注释状态
			{
			DoCConvert(pfin,pfout,&state);
			}
			break;
		case CPP://状态为C++注释状态
			{
			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);//j将它改为C++注释 输出到文件
					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://遇到EOF表示代码结束
		{
			
			fputc(start,pfout);//将EOF输到文件
			*state = END;//状态改为 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)//c注释状态  不会直接转换为END状态
	{
	case '*'://遇到'*'表示C语言注释状态  可能会结束
		{
			next = fgetc(pfin); //再重新 读取 一个字符 
			switch(next)//判断
			{
			case '/'://表示  C语言注释  结束  但要判断之后是不是'\n',因为C++注释是以换行结束的
				{
					then =fgetc(pfin);//再重新 读取 一个字符 
					if(then == '\n')//如果是'\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'://换行之后要加上 // 因为C++只注释能一行
		{
			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' ://表示 C++一行注释结束 
		{
			fputc(start,pfout);
			*state = NUL;//状态改为无注释状态
		}
		break;
	default :
		fputc(start,pfout);
		break;
	}
}

如果要是不明白  ungetc  函数    可以    点击看看  I/O系列函数



~~~~~~~~~~~~~~~~测试代码  test.c~~~~~~~~~~~~~~
#define  _CRT_SECURE_NO_WARNINGS 

#include "CommentConvert.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 ;

}<strong>
</strong>

函数写的我好累  啊, 下午写一下     转化为   C语言注释的代码 有兴趣的  c++注释转为C注释
 可以看看

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值