注释转换

这次主要讲的是把C语言的注释(/* ····  */)转换为c++的注释(//)
根据下面的图来分析情况


位置情况遇到/*时转到C语言注释的情况,遇到//时转到c++注释的情况,遇到EOF时转换为结束状态。C语言状态遇到*/转到未知状态。c++状态遇到\n时转到未知状态,遇到EOF时转到结束状态。

转换时要注意以下几个问题:

// 1.一般情况
int num = 0;
/* 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*/

CommentConvert.h

#ifndef _COMMENT_CONVERT_T_
#define _COMMENT_CONVERT_T_

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

enum State
{
	NUL_STATE,
	C_STATE,
	CPP_STATE,
	END_STATE
};

void DoCommentConvent(FILE*pfIn, FILE *pfout);
void DoNulState(FILE*pfIn, FILE*pfout, enum State*state);
void DoCState(FILE*pfIn, FILE*pfout, enum State*state);
void DoCppState(FILE*pfIn, FILE*pfout, enum State*state);

#endif //_COMMENT_CONVERT_T_

CommenConvert.c

#include"CommentConvert.h"


void DoCppState(FILE*pfIn, FILE*pfout,  enum State*state)//c++注释的情况
{
	int first = fgetc(pfIn);
	switch(first)
	{
		case'\n':       //遇到‘\n’代表这行结束,状态转换为未知状态
			fputc(first,pfout);
			*state = NUL_STATE;
			break;
		case EOF:            //遇到EOF时,转换为结束状态
			*state = END_STATE;
			break;
		default:
			fputc(first,pfout);
			break;
	}
}


void DoCState(FILE*pfIn, FILE*pfout, enum State*state)//c注释的情况
{
	int first = fgetc(pfIn);
	switch(first)
	{
	case '*':
		{
			int seccod = fgetc(pfIn);
			switch(seccod)
			{
			case '/':        遇到*/时C语言注释结束,转换为未知状态
				{
					int ret = fgetc(pfIn);
				       *state = NUL_STATE;
					if(ret == '\n') //判断*/后面有没有其他东西,有的话换行输出
					{
						fputc(ret, pfout);
					}
					else
					{
						fputc ('\n', pfout);
						ungetc(ret, pfIn);
					}
				}
				break;
			case '*':                        //*后面是*的情况,把第一个*输出,把第二个*返回去用来下次判断
				{
					fputc(first, pfout);
					ungetc(seccod,pfIn);
				}
				break;
			default:
				{
					fputc(first, pfout);
					fputc(seccod, pfout);
				}
			break;
			}
		}
		break;
	case'\n':                //遇到‘\n’时,换行的同时,在下一行加‘//’
		{
			fputc('\n', pfout);
			fputc('/', pfout);
			fputc('/', pfout);
		}
		break;   
	default:
		fputc(first, pfout);
		break;
	}
}

void DoNulState(FILE*pfIn, FILE*pfout, enum State*state)//未知情况
{
	int first = fgetc(pfIn);
	switch(first)
	{
	case '/':
		{
			int seccod = fgetc(pfIn);
			switch(seccod)
			{
			case '/':         //遇到‘//’时转换为c++状态
				{
					fputc(first, pfout);
					fputc(seccod, pfout);
					*state = CPP_STATE;
				}
				break;
			case '*':           //遇到‘/*’时转换为c状态

				{
					fputc(first, pfout);
					fputc(first, pfout);
					*state = C_STATE;
				}
				break;
			case EOF:            //遇到EOF时,转换为结束状态
				*state = END_STATE;
				break;
			default :                //其它情况原样输出
				fputc(first, pfout);
				fputc(seccod, pfout);
			}
		}
			break;
		case EOF:
			*state = END_STATE;
		break;
	    default :
			fputc(first, pfout);
		break;
	}
}

void DoCommentConvent(FILE*pfIn, FILE *pfout)
{
	enum State state = NUL_STATE;//记录状态,不同时候进入不同的情况
	while(state != END_STATE)
	{
		switch(state)
		{
		case NUL_STATE:     //未知状态时
			DoNulState(pfIn, pfout, &state);
			break;
		case C_STATE:       //C语言状态时
			DoCState(pfIn, pfout, &state);
 			break;
		case CPP_STATE:       //C++状态时
			DoCppState(pfIn, pfout, &state);
			break;
		default :
			break;
		}
	}
	printf("转换成功\n");
}


text.c

#include"CommentConvert.h"

void test1 ()//可以对一个文件夹下是所有 .c 文件进行注释转换,然后将多个.c 文件再写入另一个文件夹下去
{
	FILE *fpin = NULL;
	FILE *fpout = NULL;

	char ch = 0;
	struct _finddata_t cfile;

	char path[50] = "D:\\bite\\";
	char path1[50] = "D:\\bite\\";

	char path_out[50] =  "D:\\out\\";

	long a;

	if ((a = _findfirst (strcat (path, "*.c"), &cfile)) == -1L)
	{
		printf ("路径错误!!!\n");
		system ("pause");
		return ;
	}

	do  
    {
		strcpy (path1, "D:\\bite\\");
		strcpy (path_out, "D:\\out\\");

        if( (cfile.attrib == _A_ARCH||_A_HIDDEN||_A_RDONLY||_A_SUBDIR||_A_SYSTEM) && ~strcmp(cfile.name,".")&& ~strcmp(cfile.name,".."))  
		{
			printf("%s :",cfile.name); 
			strcat (path1,cfile.name);
			strcat (path_out,cfile.name);

			//printf ("path = %s\n", path);
			//printf ("path1 = %s\n", path1);
			//printf ("path_out = %s\n", path_out);

			fpin = fopen (path1, "r");//打开 fpin 文件
			if (fpin == NULL)
			{
				printf ("打开文件错误!!!\n");
				system ("pause");
				return ;
			}

			fpout = fopen (path_out, "w");//打开fpout 文件
			if (fpout == NULL)
			{
				printf ("打开文件错误!!!\n");
				fclose (fpin);
				system ("pause");
				return ;
			}

			DoCommentConvent (fpin, fpout);
			printf ("转换之后的路径为:%s\n\n", path_out);

			fclose (fpout);
			fclose (fpin);
				
		}
    }while(_findnext(a,&cfile) == 0); /* 成功找到时返回0*/  

	printf("\n");  
    _findclose(a);  

}


void Text()
{
	FILE*pfout = NULL;
	FILE*pfIn = fopen("input.c","r");
	if(pfIn == NULL)
	{
		printf("打开失败\n");
		exit(1);
	}
	pfout = fopen("output.c", "w");
	if(pfout == NULL)
	{
		printf("打开失败\n");
		exit(1);
	}
	DoCommentConvent(pfIn, pfout);
	fclose(pfIn);
	pfIn = NULL;
	fclose(pfout);
	pfout = NULL;
	
}

int main()
{
	test1 ();
	//Text();
	system("pause");
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值