C中注释转化为C++中注释类型

本文介绍了一个简单的注释转换工具,该工具能够将C语言风格的注释转换为C++风格的注释,同时保留原有的代码内容不变。通过解析输入文件中的注释并按规则进行转换,最终生成新的输出文件。


实现注释行的转化

//convert.h 头文件
#ifndef __CONVERT_H__
#define __CONVERT_H__
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>

#define INPUT "input.c"//定义宏代替访问的文件
#define OUTPUT "output.c"
//声明一个枚举类型,标识文档状态
enum STA{
	NULLSTAT,
	CSTAT,
	CPPSTAT,
	EOFSTAT
};
void Convert_main(FILE * input, FILE * output);

#endif

//convert.c 实现转化文件
#define _CRT_SECURE_NO_WARNINGS 1

#include"convert.h"
enum STA status = NULLSTAT;
void Do_nullstata(FILE * input, FILE * output)//普通情况处理
{
	int f = fgetc(input);
	switch (f)
	{
	case '/':
			{int s = fgetc(input);
				switch (s)
				{
				case '/':
					fputc('/', output);
					fputc('/', output);
					status = CPPSTAT;//若遇到//,转为C++状态注释处理
					break;
				case '*':
					fputc('/', output);
					fputc('/', output);
					status = CSTAT;//若遇到/*,转为C状态注释处理
					break;
				default:
					fputc(f, output);//其它情况的话,输出这个字符
					ungetc(s, input);//注意:此处的第二个字符应该退回,
					//因为不确定它与下一个字符结合会是什么情况
				}
			}
		break;
	
	case EOF:status = EOFSTAT;//若遇得到文件结尾,转为文件结束状态处理
		break;
	default://若是正常字符,输出即可
		fputc(f, output);
		status = NULLSTAT;//保留现在的状态
		break;
	}
}

void Do_cstata(FILE * input, FILE * output)//C注释状态处理
{
	int f = fgetc(input);
	switch (f)
	{
	case '\n':
		fputc(f, output);//遇到换行符则换行,并在下一行注释前面加//
		fputc('/', output);
		fputc('/', output);
		status = CSTAT;
		break;
	case '*':
			{
				int s = fgetc(input);
				switch (s)
				{
				case '/':
				{
					int t = fgetc(input);
					if (t != '\n')
					{	
						fputc('\n', output);
						ungetc(t, input);
						//若是遇到*/则注释结束,若注释后面有内容,则退回读取,设为普通状态
						//例如   *//int q = 9527;
					}
					status = NULLSTAT;
					break;
				}
				default:
					fputc(f, output);
					ungetc(s, input);//若只是一个*号,后面不是/,则输出*,第二个字符退回读取,状态不变
					//例如  /* int j = 10,2*3=6; */
					break;
				}
			}
		break;
	case EOF:
		status = EOFSTAT;
		break;
	default:
		fputc(f, output);
		status = CSTAT;
		break;
	}

}

void Do_cppstata(FILE * input, FILE * output)//C++注释状态处理
{
	int f = fgetc(input);
	switch (f)
	{
	case '\n':
		fputc(f, output);//遇到换行符,则输出,并将其转换为普通状态
		status = NULLSTAT;
		break;
	case EOF:
		status = EOFSTAT;
		break;
	default :
		fputc(f, output);//若是普通字符则输出,继续保留C++注释状态
		status = CPPSTAT;
		break;
	}
}
void Do_eofstata(FILE * input, FILE * output)//文件结束处理
{
	int f = fgetc(input);
	fputc(f, output);

}
void Convert_main(FILE * input, FILE * output)
{
	while (status != EOFSTAT)//循环访问,若每次没有遇到EOF,则继续访问
	{
		switch (status)
		{
		case NULLSTAT:
			Do_nullstata(input, output);
			break;
		case CSTAT:
			Do_cstata(input, output);
			break;
		case CPPSTAT:
			Do_cppstata(input, output);
			break;
		case EOFSTAT:
			Do_eofstata(input, output);
			break;
		default:break;
		}
	}
}
//main.c 主函数文件
#define _CRT_SECURE_NO_WARNINGS 1
#include "convert.h"

int main()
{
	FILE * finp=fopen(INPUT, "r");
	FILE * foutp = fopen(OUTPUT, "w");
	if (finp == NULL || foutp == NULL)
	{
		sprintf(stderr, "open file");
		exit(1);
	}
	else
	{
		Convert_main(finp, foutp);
	}
	
	fclose(finp);
	fclose(foutp);

	fflush(stdin);
	getchar();
	return 0;
}
//input.c 测试用例文件
//我是测试用例
// this is cpp \ncomment
/* int i = 0; */

/* int j = 10,2*3=6; */int k = 3;
/*555*/
int n = 20;
n / 2 = 10;
/*
int i = 0;
int j = 20;
int k = 250;
*//int q = 9527;

/***/

/* int z = 7748258; *//*int b=94250;*/

// /*dsklfjdasl;fdsf;ldsfds*/
//output.c 转化输出文件
//我是测试用例
// this is cpp \ncomment
// int i = 0; 
// int j = 10,2*3=6; 
int k = 3;
//555int n = 20;
n / 2 = 10;
//
//int i = 0;
//int j = 20;
//int k = 250;
//
/int q = 9527;

//*
// int z = 7748258; 
//int b=94250;
// /*dsklfjdasl;fdsf;ldsfds*/





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值