注释转换

//   将c语言注释转化为cpp注释

//头文件 "commentconvert.h"

#ifndef __COMMENT_CONVERT_H__
#define __COMMENT_CONVERT_H__
#include<stdio.h>
#include<stdlib.h>

enum STATE      //枚举四种状态
{
	NUL_STATE, 
	C_STATE, 
	CPP_STATE, 
	END_STATE
};
void CommentConvert1(FILE *pfin,FILE * pfout);                 //转换函数
void DoNULConvert1(FILE *pfin,FILE * pfout,enum STATE * state);//无状态的转换
void DoCConvert1(FILE *pfin,FILE * pfout,enum STATE * state);  //c语言状态的转换
void DoCPPConvert1(FILE *pfin,FILE * pfout,enum STATE * state); //cpp状态的转换

#endif


主函数部分

void CommentConvert1(FILE *pfin,FILE * pfout)
{
	enum STATE state =NUL_STATE; 
	while(state != END_STATE) 
	{
		switch(state)    //判断注释类型,调用对应的函数
		{
		case NUL_STATE:    
			{
				DoNULConvert1(pfin,pfout,&state);
			}
			break;
		case C_STATE:
			{
				DoCConvert1(pfin,pfout,&state);
			}
			break;
		case CPP_STATE: 
			{
				DoCPPConvert1(pfin,pfout,&state);
			}
			break;
		default:
			break;
		}
	}
}
void DoNULConvert1(FILE *pfin,FILE * pfout,enum STATE * state)   
{  
	int first = fgetc(pfin);    //从文件读取数据
	int second;  

	switch(first)  
	{  
	case'/':  
		second = fgetc(pfin);  
		if(second == '*')  
		{  
			fputc(first,pfout);  //将'/'写入文件  
			fputc('/',pfout);  
			*state = C_STATE ;     //c注释,当然此代码只是记录注释的状态,也可不写
		}  
		else if(second == '/')  
		{  
			fputc(first,pfout);  
			fputc(second,pfout);  
			*state = CPP_STATE ;    
		}  
		else    
		{  
			fputc(first,pfout);  
			fputc(second,pfout);  
		}   
		break;  
	case EOF:  
		fputc(first,pfout);  
		*state = END_STATE ;   
		break;  
	default:   
		fputc(first,pfout);  
		break;  
	}  
}  


void DoCConvert1(FILE *pfin,FILE * pfout,enum STATE * state)  
{  
	int first = fgetc(pfin);  
	int second = 0;  
	switch(first)  
	{  
	case '*':  
		second = fgetc(pfin);  
		if(second == '/')  
		{  
			int third = fgetc(pfin);  
			*state = NUL_STATE ;  
			if(third != '\n')  //处理多行注释问题
			{  
				fputc('\n',pfout);  
				ungetc(third,pfin);   


			}  
			if(third == '\n')  
			{  
				fputc(third,pfout);  
			}  
		}  
		else  
		{  
			fputc(first,pfout);  
			ungetc(second,pfin);  
		}  
		break;  
	case '\n':   
		fputc(first,pfout);  
		fputc('/',pfout);  
		fputc('/',pfout);  
		break;  
	case EOF:  
		fputc(first,pfout);  
		*state = END_STATE ;  
		break;  
	default:  
		fputc(first,pfout);  
		break;  
	}  
}   


void DoCPPConvert1(FILE *pfin,FILE * pfout,enum STATE * state) //若是cpp注释的话无需处理直接读取即可
{  
	int first = 0;  

	first = fgetc(pfin);  

	switch(first)  
	{  
	case'\n':   
		fputc(first,pfout);  
		*state = NUL_STATE ;  
		break;  
	case EOF:  
		fputc(first,pfout);  
		*state = END_STATE ;  
		break;  
	default :  
		fputc(first,pfout);  
		break;  
	}  
}  


//测试区

void text1()
{
	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);
	}
	CommentConvert1(pfin,pfout);
	 
	printf("转换成功\n");
	fclose(pfin);//关闭两文件
	fclose(pfout);
}

//cpp注释转化为c语言注释也同理函数并没有多大的变化

#ifndef __COMMENT_CONVERT_H__
#define __COMMENT_CONVERT_H__
#include<stdio.h>
#include<stdlib.h>

enum STATE  
{
	NUL_STATE, 
	C_STATE, 
	CPP_STATE, 
	END_STATE
};
void CommentConvert2(FILE *pfin,FILE * pfout);
void DoNULConvert2(FILE *pfin,FILE * pfout,enum STATE * state);
void DoCConvert2(FILE *pfin,FILE * pfout,enum STATE * state);
void DoCPPConvert2(FILE *pfin,FILE * pfout,enum STATE * state);

#endif


//主函数

void CommentConvert2(FILE *pfin,FILE * pfout)
{
	enum STATE state =NUL_STATE; 
	while(state != END_STATE) 
	{
		switch(state)
		{
		case NUL_STATE:
			{
				DoNULConvert2(pfin,pfout,&state);
			}
			break;
		case C_STATE:
			{
				DoCConvert2(pfin,pfout,&state);
			}
			break;
		case CPP_STATE: 
			{
				DoCPPConvert2(pfin,pfout,&state);
			}
			break;
		default:
			break;
		}
	}
}
void DoNULConvert2(FILE *pfin,FILE * pfout,enum STATE * state)
{
	int first = 0;
	int second = 0;
	first = fgetc(pfin); 
	switch( first)
	{
		case '/':
		{
			second = fgetc(pfin); 
			switch(second)
			{
			case '*': 
				{
					fputc(first,pfout); 
					fputc(second,pfout);
					//*state = C_STATE; 
				}
				break;
			case '/': 
				{
				fputc('/',pfout); 
				fputc('*',pfout);
				//*state  = CPP_STATE;   
				}
				break;
			default:     
				{
				fputc(first,pfout);  
				ungetc(second,pfin);
				}
				break;
			}
		}
		break;
		case EOF: 
		{
			fputc(first,pfout); 
			//*state = END_STATE; 
		}
		break;
		default:  
		{
			fputc(first,pfout);	 
		}
		break ;
	}
}
 
 void DoCPPConvert2(FILE *pfin,FILE * pfout,enum STATE * state)
{
	int first = 0;
	int second = 0;
	int third = 0;
	first = fgetc(pfin);
	switch(first)
	{
	case '\n' :  
		{
			second = fgetc(pfin);
			switch(second)
			{
			case '/':
				{		
					third =  fgetc(pfin);
					if(third =='*')
					{	
						fputc('*',pfout);
						fputc('/',pfout);
						fputc(first,pfout);
						fputc(second,pfout);
						fputc(third,pfout);
						*state = C_STATE;
					}
					else if(third =='/')
					{
						fputc(first,pfout);
					}
				}
				break;
			case EOF:
				fputc('*',pfout);
				fputc('/',pfout);
				fputc(first,pfout);
				fputc(second,pfout);
				*state = END_STATE;
				break;
			default:
				fputc('*',pfout);
				fputc('/',pfout);
				fputc(first,pfout);
				fputc(second,pfout);
				*state = NUL_STATE;
				break;
			}
		}
		break;
	case '*':
		{
			second = fgetc(pfin);
			if(second == '/')
			{;}
			else
			{
			ungetc(second,pfin);
			fputc(first,pfout);			
			}
		
		}
		break;
	default:
		fputc(first,pfout);
		break;
	}
}
 
void DoCConvert2(FILE *pfin,FILE * pfout,enum STATE * state)
{
	int first = 0;
	int second = 0;
	int third = 0;
	first = fgetc(pfin);
	switch(first) 
	{
	case '*':    
		{
			second = fgetc(pfin);  
			switch(second)
			{
			case '/':  
				{
					fputc(first,pfout);
					fputc(second,pfout);
					*state = NUL_STATE;
				}
				break;
			default :
				{
				fputc(first,pfout);
				ungetc(second,pfin); 
				}
			break;
		    }
		}
		break;	
	default:
		fputc(first,pfout); 
		break;
	}
}

//测试区

void text2()
{
	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);
	}
	CommentConvert2(pfin,pfout);

	printf("转换成功\n");
	fclose(pfin);//关闭两文件
	fclose(pfout);
}

 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值