注释转换(C注释转换为c++注释)

对于注释转换首先给出我的测试图:


由图可以看出将左边的c语言注释转换为右边c++注释就是注释转换


首先说明一下转换思想方法:

1.创建两个文件input.c和output.c,input.c里面用来读取c语言的注释,output.c里面保存转换成为c++的注释,中间的转换过程就是代码完成,当然文件名字和作用自己规定

2.转换的实际过程就是从存放c语言注释的文件中读取数据这里是一个字符一个字符读取,然后通过相关的函数将其转换为c++注释后的代码再写入保存c++注释的文件中

当然这里会用fgetc和fputc函数,其实这个项目就是练习文件的读写能力

在这里封装了三个函数:

1.void donulstate(FILE *pfin, FILE *pfout, enum STATE *s);//非C++,C状态的函数声明
这个是不存在注释的代码语句处理函数,即刚开始进入文件读写的函数

2.void docstate(FILE *pfin, FILE *pfout, enum STATE *s);//c状态进行操作
这个是发现是c语言注释的语句,则用这个函数将其改造为c++注释

3.void docppstate(FILE *pfin, FILE *pfout, enum STATE *s);//c++状态进行操作
这个是发现是c语言注释的语句,则用这个函数将其改造读写到保存c++注释额文件中

其核心的思想部分是这个样子,我用图来解释:


接下来给出具体的代码

首先给出commentconver.h头文件

#define _CRT_SECURE_NO_WARNINGS 1
#ifndef __COMMENT_CONVER_H__
#define __COMMENT_CONVER_H__
#include<stdio.h>
#include<stdlib.h>
enum STATE
{
	END_STATE,//结束
	NUL_STATE,//无状态
	C_STATE,//c注释函数
	CPP_STATE,//c++状态
};

void donulstate(FILE *pfin, FILE *pfout, enum STATE *s);//非C++,C,结束状态的函数声明
void docstate(FILE *pfin, FILE *pfout, enum STATE *s);//c状态进行操作
void docppstate(FILE *pfin, FILE *pfout, enum STATE *s);//c++状态进行操作
#endif
接下来给出commentconver.c具体状态函数的实现代码

#define _CRT_SECURE_NO_WARNINGS 1
#include"CommentConver.h"
void donulstate(FILE *pfin, FILE *pfout, enum STATE *s)//开始无状态
{
	int first =0;
	first = fgetc(pfin);
	switch (first)
	{
	case '/'://第一个读取到'/'
		{
				int sceond = fgetc(pfin);
				switch (sceond)
				{
				case '/'://第二个也读取‘/’,c++注释
				{
							*s = CPP_STATE;//状态转化到c++状态里面去
							fputc(first, pfout);
							fputc(sceond, pfout);
				}
					break;
				case '*'://第二个读取到*为c的注释
				{
							*s = C_STATE;//状态转换到c状态里面去
							fputc('/', pfout);
							fputc('/', pfout);	
				}
					break;
				default://	其他非注释情况直接读取
				{
						   fputc(first, pfout);
						   fputc(sceond, pfout);
				}
					break;
				}
		}
			break;
	case EOF://直接文件读取结束
	{
				*s = END_STATE;	
	}
		break;
	default://刚开始未发现注释相关符号
	{
			   fputc(first, pfout);
	}
		break;
	}
}
void docstate(FILE *pfin, FILE *pfout, enum STATE *s)//C注释状态
{
	int first = 0;
	first = fgetc(pfin);
	switch (first)
	{
	    case '*'://结尾读取到*
	     {
				int sceond = 0;
				sceond = fgetc(pfin);
				switch (sceond)
				{
				case '/'://一般情况:/* int i = 0; */
				{
							*s = NUL_STATE;//不需要操作
				}
					break;
				case '*'://连续注释问题如:/***/
				{
							fputc(first, pfout);
							ungetc(sceond, pfin);
				}
					break;
				default://其它非注释情况
				{
						   fputc(first, pfout);
						   fputc(sceond, pfout);
				}
				}
	    }
		break;
		case '\n'://多行注释问题
		{
					 fputc(first, pfout);
					 fputc('/', pfout);
					 fputc('/', pfout);
		 }
			break;
	default://结尾直接是其他非注释情况
	{
			   fputc(first, pfout);
	}
		break;
	}
}

void docppstate(FILE *pfin, FILE *pfout, enum STATE *s)//c++注释状态
{
	int first = 0;
	first = fgetc(pfin);
	switch (first)
	{
	case '\n'://一般情况
	{
				 fputc(first, pfout);
				 *s = NUL_STATE;
	}
		break;
	case EOF://文件读取结束
	{
				*s = END_STATE;
	}
		break;
	default://其他非注释情况
		fputc(first, pfout);
		break;
	}
}
最后给出test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"CommentConver.h"
void commentconver(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;
		}
	}
}
void test()
{
	FILE *pfin = fopen("input.c", "r");//从文件里面读取东西
	if (pfin == NULL)
	{
		perror("use open file read");
		exit(EXIT_FAILURE);
	}
	FILE *pfout = fopen("output.c", "w");//往文件里面写东西
	if (pfout == NULL)
	{
		perror("use open file write");
		exit(EXIT_FAILURE);
	}
	//
	commentconver(pfin, pfout);//调用转换函数
	fclose(pfin);
	fclose(pfout);
}
int main()
{
	test();
	system("pause");
	return 0;
}
由于开头给出的图片就是我的测试结果所以这里就不放测试结果了

欢迎大家留言一起交流学习!




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值