c语言| |注释转换

注释转换。对于一个项目有多个人来写代码,如果每个人的代码注释风格不一样,有的人要用C注释风格,有的人用C++注释风格这就导致了,对于阅读源代码的人的不方便的问题。因此才会出现注释转换的这个东西。

本注释转换将所有程序的注释全部转换成C++代码的注释风格。

首先列出所有可能出现的情况:

// 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,功能源文件CommentConvert.c,测试源文件test.c

CommentConvert.h

#ifndef __CommentConvert_H__
#define __CommentConvert_H__

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

enum State //状态,四种,无注释状态,c注释,cpp注释,结束状态
{
	NUL_STATE,
	C_STATE,
	CPP_STATE,
	END_STATE
};

void DoNulState(FILE* pfIn, FILE* pfOut, enum State *state);//无注释
void DoCState(FILE* pfIn, FILE* pfOut, enum State *state);//c注释
void DoCppState(FILE* pfIn, FILE* pfOut, enum State *state);//cpp注释
void CommentConvert(FILE* pfIn, FILE* pfOut);//注释转换



#endif //__CommentConvert_H__

CommentConvert.c

#include "CommentConvert.h"

void DoNulState(FILE* pfIn, FILE* pfOut, enum State *state) //无注释状态
{
	int frist = fgetc(pfIn);
	switch (frist)
	{
	case '/':
	{
		int second = fgetc(pfIn);
		switch (second)
		{
		case '/':
		{
			fputc(frist, pfOut);
			fputc(second, pfOut);
			*state = CPP_STATE;
			break;
		}
		case '*':
		{
			fputc('/', pfOut);
			fputc('/', pfOut);
			*state = C_STATE;
			break;
		}
		default:
		{
			fputc(frist, pfOut);
			fputc(second, pfOut);
			*state = NUL_STATE;
			break;
		}
		}
	}
	break;
	case EOF:
		//fputc(frist, pfOut);
		*state = END_STATE;
		break;
	default:
		fputc(frist, pfOut);
		*state = NUL_STATE;
		break;
	}
}

//      // 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*/

void DoCState(FILE* pfIn, FILE* pfOut, enum State *state)//c注释状态   /*           */
{
	int frist = fgetc(pfIn);
	switch (frist)
	{
	case '*':
	{
		int second = fgetc(pfIn);
		switch (second)
		{
		case '/':
		{
			int third = fgetc(pfIn);//出现/*    */\n情况,情况1
			if (third == '\n')
			{
				fputc(third, pfOut);
			}
			else if (third != '\n')//出现/*    */int i = 0;情况,情况2
			{
				fseek(pfIn, -1, SEEK_CUR);
				fputc('\n', pfOut);
			}
		}
			*state = NUL_STATE;
			break;
		case '*':
		{
			fseek(pfIn, -1, SEEK_CUR); //出现/***/情况,情况6
			fputc(frist, pfOut);
		}
		*state = C_STATE;
		break;
		default:
			fputc(frist, pfOut);
			fputc(second, pfOut);
			*state = C_STATE;
			break;
		}
	}
	break;
	case '\n':
	{
		fputc(frist, pfOut); //出现/*\n的情况,情况4
		fputc('/', pfOut);
		fputc('/', pfOut);
	}
	*state = C_STATE;
	break;
	default:
		fputc(frist, pfOut); //出现/*ahdkj/*jlj*/情况,情况3
		*state = C_STATE;
		break;
	}
}

void DoCppState(FILE* pfIn, FILE* pfOut, enum State *state)//c++注释状态         //
{
	int frist = fgetc(pfIn);
	switch (frist)
	{
	case '\n':
		fputc(frist, pfOut);
		*state = NUL_STATE;
		break;
	case EOF:
		//fputc(frist, pfOut);
		*state = END_STATE;
		break;
	default:
		fputc(frist, pfOut);
		*state = CPP_STATE;
		break;
	}
}

void CommentConvert(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:
			DoCState(pfIn, pfOut, &state);
			break;
		case CPP_STATE:
			DoCppState(pfIn, pfOut, &state);
			break;
		default:
			break;
		}
	}
}

test.c

#include "CommentConvert.h"

void test()
{
	FILE* pfIn = NULL;
	FILE* pfOut = NULL;
	pfIn = fopen("input.c", "r"); //以读的方式打开
	if (pfIn == NULL)
	{
		perror("open file for read");
		exit(EXIT_FAILURE);
	}
	pfOut = fopen("output.c", "w"); //以写的方式打开
	if (pfOut == NULL)
	{
		fclose(pfIn);//如果output文件没有打开的话,就要将已经打开的input文件进行关闭
		pfIn = NULL;
		perror("open file for write");
		exit(EXIT_FAILURE);
	}

	CommentConvert(pfIn, pfOut);

	//关闭所有文件
	fclose(pfIn); 
	pfIn = NULL;
	fclose(pfOut);
	pfOut = NULL;
}


int main()
{
	test();
	return 0;
}

这就是所有代码。如有错误请指出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值