注释转换项目

注释转换:由C语言的注释全部转换为C++的注释风格。

从input.c文件里读取的内容注释转换存储到output.c文件中。

状态图为:


                     通常采用switch case语句来处理。

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

代码为:

测试源文件 test.c

#include "commentconvert.h"

int main()
{
	int frist=0;
	FILE* pfout=NULL;
	FILE* pfin=NULL;
    enum STATE state=NUL_STATE;
    pfin=fopen(INPUT,"r");
	if(pfin==NULL)
	{
		perror("out of read");
		exit(EXIT_FAILURE);
	}
    pfout=fopen(OUTPUT,"w");
	if(pfout==NULL)
	{
		perror("out of write");
		fclose(pfin);
		exit(EXIT_FAILURE);
	}
	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;
		}
	}
	printf("转换成功\n");
	system("pause");
	return 0;
}

头文件commentconvert.h

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

#define INPUT "input.c"
#define OUTPUT "output.c"

enum STATE
{
	END_STATE,
	NUL_STATE,
	C_STATE,
	CPP_STATE
	
};
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 //_COMMENTCONVERT_H__


源文件commentconvert.h

#include "commentconvert.h"
void DONULSTATE(FILE* pfin,FILE* pfout,enum STATE* state)
{
	int frist=0;
	int second=0;
	frist=fgetc(pfin);
	switch(frist)
	{
	case '/':
		{
			second=fgetc(pfin);
			switch(second)
			{
			case '*':
				{
					
					fputc('/',pfout);
					fputc('/',pfout);
					*state=C_STATE;
				}
				break;
			case '/':
				fputc(frist,pfout);
				fputc(second,pfout);
				*state=CPP_STATE;
				break;
			default:
				break;
			}
		}
		break;
	case EOF:
		*state=END_STATE;
		break;
	default:
		fputc(frist,pfout);
		break;
	}
}
void DOCSTATE(FILE* pfin,FILE* pfout,enum STATE* state)
{
	int frist=0;
	int second=0;
	int thrid=0;
	frist=fgetc(pfin);
	switch(frist)
	{
	case '*':
		{
			second=fgetc(pfin);
			switch(second)
			{
			case '/':
				thrid=fgetc(pfin);
				switch(thrid)
				{
				case '\n':
					fputc(thrid,pfout);
					*state=NUL_STATE;
					break;
				case '/':
					fputc('\n',pfout);
					ungetc(thrid,pfin);
					*state=NUL_STATE;
					break;
				default:
					fputc('\n',pfout);
					ungetc(thrid,pfin);  //撤销字符
					*state=NUL_STATE;
					break;
				}
				break;
			default:
				fputc(frist,pfout);
				ungetc(second,pfin);

				break;
			}
		}
		break;
	case '\n':
		fputc(frist,pfout);
		fputc('/',pfout);
		fputc('/',pfout);
		break;
	default:
		fputc(frist,pfout);
		break;
	}
}
void DOCPPSTATE(FILE* pfin,FILE* pfout,enum STATE* state)
{
	int frist=0;
	frist=fgetc(pfin);
	switch(frist)
	{
	case '\n':
		fputc(frist,pfout);
		*state=NUL_STATE;
		break;
	case EOF:
		*state=END_STATE;
		break;
	default:
		fputc(frist,pfout);
		break;
	}
}

最后转换完成后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*/



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值