注释转换——C语言项目

注释转换:将C语言中的注释风格/*...*/转换为C++的注释风格//.

转换方法先分析如下图:


由图可以看出,将注释转换过程分为四种状态,NULL_STATE(无注释状态)、C_STATE(C语言注释状态)、CPP_STATE(C++注释状态)、END_STATE(文件结束状态),通过四种状态的相互切换实现注释的转换,具体实现过程为:用文件的方式中函数fopen打开源文件input.c,并进行读操作,打开output.c文件,进行注释转换后的写操作,转换过程中调用函数CommentConvert(pfIn,pfOut)转换,先在NULL_STATE状态下用函数fgetc函数读取第一个字符,若为'/',再读取第二个字符,若为'*'则切换到C_STATE状态实现,若第二个字符为'/',则切换到CPP_STATE状态实现,如此一直相互切换,并在各自状态具体代码实现下用fputc函数输出转换为C++注释和各个原字符,直至遇到EOF,状态切换为end_state.

而在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*/
根据这些情况,在此项目中我们则将这作为input.c文件对其进行转换,具体代码实现过程如下:

分别定义三个文件:

头文件CommentConvert.h

#ifndef __CommentConvert_H__
#define __CommentConvert_H__
#include <stdio.h>
#include <stdlib.h>
enum STATE
{
	NUL_STATE,
	C_STATE,
	CPP_STATE,
	END_STATE,
};

void CommentConvert(FILE *pfIn,FILE *pfOut);
void Do_NUL_STATE(FILE *pfIn,FILE *pfOut,enum STATE *state);
void Do_C_STATE(FILE *pfIn,FILE *pfOut,enum STATE *state);
void Do_CPP_STATE(FILE *pfIn,FILE *pfOut,enum STATE *state);

#endif __CommentConvert_H__

功能文件 CommentConvert.c

#include "CommentConvert.h"
void CommentConvert(FILE *pfIn,FILE *pfOut)
{
	void DoConverWork(FILE *pfIn,FILE *pfOut);
	DoConverWork(pfIn,pfOut);
}
void DoConverWork(FILE *pfIn,FILE *pfOut)
{
	enum STATE state=NUL_STATE;
	while(state!=END_STATE)
	{
		switch(state)
		{
		case NUL_STATE:
			Do_NUL_STATE(pfIn,pfOut,&state);
			break;
		case C_STATE:
			Do_C_STATE(pfIn,pfOut,&state);
			break;
		case CPP_STATE:
			Do_CPP_STATE(pfIn,pfOut,&state);			
			break;
		default:
			break;
		}
	}
}

void Do_NUL_STATE(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('/',pfOut);
					fputc('/',pfOut);
					*state=C_STATE;
				}
				break;
			case '/':
				{
					fputc(first,pfOut);
					fputc(second,pfOut);
					*state=CPP_STATE;
				}
				break;
			default:
				{
					fputc(first,pfOut);
					fputc(second,pfOut);
				}
				break;
			}
		}
		break;
	case EOF:
		*state=END_STATE;
		break;
	default:
		fputc(first,pfOut);
		break;
	}
}

void Do_C_STATE(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 '/':
				{
					third=fgetc(pfIn);
				        if(third!='\n')
					{
						fputc('\n',pfOut);
					}
					if(third=='/')
					{
						ungetc(third,pfIn);
						*state=NUL_STATE;
						break;
					}
					fputc(third,pfOut);
					*state=NUL_STATE;
				}
				break;
			case '*':
				{
					fputc(first,pfOut);
					third=fgetc(pfIn);
					if(third=='/')
					{
						*state=NUL_STATE;
						break;
					}
					fputc(second,pfOut);
					ungetc(third,pfIn);
				}
				break;
			default:
				{
					fputc(first,pfOut);
					fputc(second,pfOut);
				}
				break;
			}
		}
		break;
	case '\n':
		{
			fputc(first,pfOut);
			fputc('/',pfOut);
			fputc('/',pfOut);
		}
		break;
	case EOF:
		*state=END_STATE;
		break;
	default:
		fputc(first,pfOut);
		break;
	}
}

void Do_CPP_STATE(FILE *pfIn,FILE *pfOut,enum STATE *state)
{
	int first=0;
	first=fgetc(pfIn);
	switch(first)
	{
	case '\n':
		{
			fputc(first,pfOut);
			*state=NUL_STATE;
		}
		break;
	case EOF:
		*state=END_STATE;
		break;
	default:
		fputc(first,pfOut);
		break;
	}
}

测试文件 test.c

#include "CommentConvert.h"
int main()
{
	FILE *pfIn=NULL;
	FILE *pfOut=NULL;
	pfIn=fopen("input.c","r");
	if(pfIn==NULL)
	{
		perror("error input.c");
		exit(EXIT_FAILURE);
	}
	pfOut=fopen("output.c","w");
	if(pfOut==NULL)
	{
		perror("error output.c");
		fclose(pfIn);
		exit(EXIT_FAILURE);
	}
	CommentConvert(pfIn,pfOut);
	printf("****转换成功****\n");
	fclose(pfIn);
	fclose(pfOut);
	system("pause");
	return 0;
}

当转换成功后,input.c文件写入output.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*/


你可能感兴趣的:(注释转换——C语言项目)