C语言编写注释转换问题

今天学习了用编程来实现将C语言注释转换成C++注释

CommentConvert.h

#ifndef _COMMENT_COVERT_H
#define _COMMENT_COVERT_H
#define INPUTFILENAME "input.c"
#define OUTPUTFILENAME "output.c"
#include<stdio.h>
#include<stdlib.h>

enum STATE
{
	NUL_STATE,
	C_STATE,
	CPP_STATE,
	END_STATE
};
void DoConverentWork(FILE* pfIn,FILE* pfOut);
void DoNulState(FILE* pfIn,FILE* pfOut);
void DoCState(FILE* pfIn,FILE* pfOut);
void DoCPPState(FILE* pfIn,FILE* pfOut);
#endif

CommentConvert.c

#include"CommentConvert.h"
enum STATE state=NUL_STATE;
void DoConverentWork(FILE* pfIn,FILE* pfOut)
{
	
	while(state!=END_STATE)
	{
		switch(state)
		{
		    case NUL_STATE:
		        DoNulState(pfIn,pfOut);
			    break;
			case C_STATE:
			    DoCState(pfIn,pfOut);
			    break;
			case CPP_STATE:
				DoCPPState(pfIn,pfOut);
				break;
			case END_STATE:
					break;
			default:
				break;
		}
	}
}

void DoNulState(FILE* pfIn,FILE* pfOut)
{
	int first=0;
	int second=0;
	first=fgetc(pfIn);
	switch(first)
	{
	case '/':
		second=fgetc(pfIn);
		switch(second)
		{
		case'*':           //C注释转换为C++注释   
			fputc('/',pfOut);
			state=C_STATE;
            break;
		case'/':          //C++注释直接输出并进入C++模式 
			fputc(first,pfOut);
			state=CPP_STATE;
			break;
		default:         //其他字符直接输出
			fputc(first,pfOut);
            break;
		}
	case EOF:        //文件结束标志
		fputc(first,pfOut);
		break;
	default:         //不是注释的字符
        fputc(first,pfOut);
		break;

	}
}

void DoCState(FILE* pfIn,FILE* pfOut)
{
	int first =0;
	int second =0;
	int third =0;
	first=fgetc(pfIn);
	switch(first)
	{
	case '*':       //6.连续的/***/
		{
			second=fgetc(pfIn);
			switch(second)
			{
			case '/':
				third=fgetc(pfIn);
				if(third!='\n')
					fputc('\n',pfOut);
					fputc(third,pfOut);//4.多行注释问题
				if(third=='/')       //5.连续的注释问题/**//**/
					ungetc('/',pfIn);
				    state=NUL_STATE;
					break;

			case '*':
				third=fgetc(pfIn);
				fputc(first,pfOut);
                if(third=='/')
				{
					state=NUL_STATE;
				}
				break;
			default:          //不是注释问题
				fputc(first,pfOut);
				fputc(second,pfOut);
				break;
            }

		}
		break;
	case '\n':           //4、C注释中的多行注释
		fputc('\n',pfOut);
		fputc('/',pfOut);
		fputc('/',pfOut);
		break;
	case EOF:        //文件结束标志
		state=END_STATE;
		break;
	default:           //不是注释的字符
		fputc(first,pfOut);
		break;

	}
}

void DoCPPState(FILE* pfIn,FILE* pfOut)
{
	int first=0;
	first=fgetc(pfIn);
	switch(first)
	{
	case '\n':
		fputc(first,pfOut);
		state=NUL_STATE;
		break;
	case EOF:
		state=END_STATE;
		break;
    default:
		fputc(first,pfOut);
		break;
	}
}


test.c

#include"CommentConvert.h"
int main()
{
	FILE* pfIn=NULL;
	FILE* pfOut=NULL;
	printf("转换开始\n");
	pfIn=fopen(INPUTFILENAME,"r");
	if(NULL==pfIn)
	{
		perror("open file for read\n");
		exit(EXIT_FAILURE);
	}
	pfOut=fopen(OUTPUTFILENAME,"w");
	if(NULL==pfOut)
	{
		fclose(pfOut);
		perror("open file for write\n");
        exit(EXIT_FAILURE);
	}
	DoConverentWork(pfIn,pfOut);
	printf("转换结束\n");
}


程序运行结果如下:

新建一个input.c的文件查看结果




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值