注释转换

本函数就是见得实现一下C注释、CPP注释和普通模式之间的转换

(这只是在下的粗浅理解,不足的地方还请谅解,欢迎留言提出,后期理解深入后会加以改进)


1、先来了解一下这四种模式之间转换的条件


2、接下来就是完成的主要步骤了

我是将主函数与实现函数分不同的文件建立的

(1)、分别建立 mian.c   convert_comment.c  convert_comment.h三个新建项

在mian.c 中是主函数只需要调用在convert_comment.c 的函数就OK了

在convert_comment.h中就是函数的声明了


convert_comment.c中就是函数的定义了

这也是最主要的代码部分

(2)、接下来将详细的介绍代码部分

也就是三个函数的实现

普通模式


void do_null_status(FILE *ifp, FILE *ofp)         //普通模式
{
	int c = fgetc(ifp);
	if (c == '/')                           //是 '/'时,进入判断 
	{
		int s = fgetc(ifp);
		if (s == '*')                  //下一发是'*'时
		{
			fputc('/', ofp);       
			fputc('/', ofp);        //将'/*'转换为'//'
			status = CSTATUS;       //转换至C注释函数
		}
		else if (s == '/')             //下一个是'/'时
		{
			fputc('/', ofp);
			fputc('/', ofp);
			status = CPPSTATUS;       //转换至CPP注释函数
		}
		else
		{
			fputc(c, ofp);        
			ungetc(c, ifp);
		}
	}
	else if (c == EOF)                       //为EOF时,文件结束
		status = EOFSTATUS;
	else 
		fputc(c, ofp);
}

C注释


void do_c_status(FILE *ifp, FILE *ofp)           //C注释
{
	int c = fgetc(ifp);
	if (c == '*')                         //为'*'时进入判断
	{
		int s = fgetc(ifp);
		if (s == '/')                //为'/'时,说明C注释结束
		{	
			fputc('\n', ofp);
			status = NULLSTATUS;    //转入普通模式
		}
		else
		{
			fputc(c, ofp);
			ungetc(c, ifp);
			status = CSTATUS;
		}
	}
	else if (c == EOF)
		status = EOFSTATUS;
	else if (c == '\n')                //因为C注释是多行注释,所以遇到'\n’时,还是C注释,
	{                                  //需要给下一行添加'//'
		fputc(c, ofp);
		fputc('/', ofp);
		fputc('/', ofp);
		status = CSTATUS;
	}
	else
	{
		fputc(c, ofp);
		status = CSTATUS;
	}
}

CPP注释


void do_cpp_status(FILE *ifp, FILE *ofp)          //CPP注释
{
	int c = fgetc(ifp);
	if (c == '\n')                            //若为'\n'则CPP注释结束
	{
		fputc(c, ofp);
		status = NULLSTATUS;              //转为普通模式
	}
	else if (c == EOF)                       //为EOF则文件结束
	{
		fputc(c, ofp);
		status = EOFSTATUS;
	}
	else
	{
		fputc(c, ofp);
		status = CPPSTATUS;
	}
}
以上就是我的理解

下面是整体代码

mian.c

#include<stdio.h>

#include"convert_comment.h"

int main()
{
	convert_main();
	return 0;
}
convert_comment.h

#ifndef __CONVERT_COMMENT_H__
#define __CONVERT_COMMENT_H__

#define INPUTFILE "input.c"
#define OUTPUTFILE "output.c"

enum 
{
	NULLSTATUS,     // 普通模式
	CSTATUS,        // C模式
	CPPSTATUS,      //CPP模式
	EOFSTATUS,      //EOF模式
};

void convert_main();
void do_null_status(FILE *ifp, FILE *ofp); //普通模式函数声明
void do_c_status(FILE *ifp, FILE *ofp);    //C注释函数声明
void do_cpp_status(FILE *ifp, FILE *ofp);  //CPP注释函数声明

#endif
convert_comment.c

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

#include "convert_comment.h"

int status = NULLSTATUS;

void do_null_status(FILE *ifp, FILE *ofp)         //普通模式
{
	int c = fgetc(ifp);
	if (c == '/')
	{
		int s = fgetc(ifp);
		if (s == '*')
		{
			fputc('/', ofp);
			fputc('/', ofp);
			status = CSTATUS;
		}
		else if (s == '/')
		{
			fputc('/', ofp);
			fputc('/', ofp);
			status = CPPSTATUS;
		}
		else
		{
			fputc(c, ofp);
			ungetc(c, ifp);
		}
	}
	else if (c == EOF)
		status = EOFSTATUS;
	else 
		fputc(c, ofp);
}

void do_c_status(FILE *ifp, FILE *ofp)           //C注释
{
	int c = fgetc(ifp);
	if (c == '*')
	{
		int s = fgetc(ifp);
		if (s == '/')
		{	
			fputc('\n', ofp);
			status = NULLSTATUS;
		}
		else
		{
			fputc(c, ofp);
			ungetc(c, ifp);
			status = CSTATUS;
		}
	}
	else if (c == EOF)
		status = EOFSTATUS;
	else if (c == '\n')
	{
		fputc(c, ofp);
		fputc('/', ofp);
		fputc('/', ofp);
		status = CSTATUS;
	}
	else
	{
		fputc(c, ofp);
		status = CSTATUS;
	}
}

void do_cpp_status(FILE *ifp, FILE *ofp)          //CPP注释
{
	int c = fgetc(ifp);
	if (c == '\n')
	{
		fputc(c, ofp);
		status = NULLSTATUS;
	}
	else if (c == EOF)
	{
		fputc(c, ofp);
		status = EOFSTATUS;
	}
	else
	{
		fputc(c, ofp);
		status = CPPSTATUS;
	}
}

void convert_work(FILE *ifp, FILE *ofp)
{
	while (status != EOFSTATUS)
	{
		switch (status)
		{
		case NULLSTATUS:
			do_null_status(ifp, ofp);
			break;
		case CSTATUS:
			do_c_status(ifp, ofp);
			break;
		case CPPSTATUS:
			do_cpp_status(ifp, ofp);
			break;
		case EOFSTATUS:
			break;
		default:
			break;
		}
	}
}
void convert_main()
{
    FILE *ifp = fopen(INPUTFILE, "r");
	FILE *ofp = fopen(OUTPUTFILE, "w");
	if (ifp == NULL || ofp == NULL)
	{
		printf("This is no have!");
		return;
	}

	convert_work(ifp, ofp);

	fclose(ifp);
	fclose(ofp);
}


运行结果图





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值