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

注释转换 续

关于注释转换的问题  ,这里就不提了 。之前就已经   说明过是什么意思了 
如果你你要是不知道  ,就点击这里   看看吧   注释转换


今天  要说的是将  C++注释转换为C语言注释  ,大家都知道  C++注释的风格 是  //.......注释一行 ,然后以\n作为
结束标志的,所以要将注释转换 ,   也同样要考虑多种  用问题  ,

下面是我写的一些实例  
/* 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;

代码实现  

~~~~~~~~~~头文件 .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(start,pfout);//将注释输出到文件
					fputc(next,pfout);
					*state = C;//状态转换为  C注释状态
				}
				break;
			case '/'://表示代码是 //  表示进入C++注释状态
				{
				fputc('/',pfout);//j将它改为C注释 输出到文件
				fputc('*',pfout);
				*state  = CPP;  //状态转换为  C++注释状态
				}
				break;
			default:   //表示这个'/ '是字符 
				{
				fputc(start,pfout); //将读取到的字符输出到文件
				ungetc(next,pfin);
				}
				break;
			}
		}
		break;
		case EOF://遇到EOF表示代码结束
		{
			fputc(start,pfout);//将EOF输到文件
			*state = END;//状态改为 END
		}
		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++一行注释结束 
		{
			next = fgetc(pfin);
			switch(next)//判断 下行 是不是也是注释
			{
			case '/':
				{		
					then =  fgetc(pfin);
					if(then =='*')
					{	
						fputc('*',pfout);
						fputc('/',pfout);
						fputc(start,pfout);
						fputc(next,pfout);
						fputc(then,pfout);
						*state = C;
					}
					else if(then =='/')
					{
						fputc(start,pfout);
					}
				}
				break;
			case EOF:
				fputc('*',pfout);
				fputc('/',pfout);
				fputc(start,pfout);
				fputc(next,pfout);
				*state = END;
				break;
			default:
				fputc('*',pfout);
				fputc('/',pfout);
				fputc(start,pfout);
				fputc(next,pfout);
				*state = NUL;
				break;
			}
		}
		break;
	case '*':
		{
			next = fgetc(pfin);
			if(next == '/')
			{;}
			else
			{
			ungetc(next,pfin);
			fputc(start,pfout);			
			}
		
		}
		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语言注释  结束  
				{
					fputc(start,pfout);
					fputc(next,pfout);
					*state = NUL;//状态装换为无注释状态
				}
				break;
			default :
				{
				fputc(start,pfout);
				ungetc(next,pfin);//将多余用来判断的字符撤销 
				}
			break;
		    }
		}
		break;	
	default:
		fputc(start,pfout); //否则直接输出
		break;
	}
}

~~~~~~~~~~~测试代码 .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>








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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值