注释转换

4 篇文章 0 订阅

C语言的注释        /*C语言*/

C++的注释          //C++

本文写的注释转换是将C语言注释转换为C++注释

大概有这几种情况

//1.一般情况
/* int i = 0; */


//2.换行问题
/* int i = 0; */ int j = 0;
/* int i = 0; */
int j = 0;


//3.匹配问题
/* int i = 0; /*xxxxxxx*/


//4.多行注释问题
/*
int i = 0;
int j = 0;
int k = 0;
*/int k = 0;


//5.连续注释问题
/**/ /**/


//6.连续**/问题
/***/


//7.c++注释问题
// /*xxxxxxxx*/


主要的思想为


代码为:

CommentCovert.h

#define _CRT_SECURE_NO_WARNINGS 1
#ifndef _COMMENT_COVERT__H_
#define _COMMENT_COVERT__H_

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

#define INPUT_FILE "input.c"
#define OUTPUT_FILE "output.c"

typedef enum STATE
{
	NUL_STATE,//无状态
	C_STATE,//C状态
	CPP_STATE,//C++状态
	END_STATE//结束
}State;

void DoConverWork(FILE* pfRead,FILE* pfWrite);//转换工作

void DoNulState(FILE* pfRead, FILE* pfWrite);//空状态
void DoCState(FILE* pfRead, FILE* pfWrite);//C状态
void DoCppState(FILE* pfRead, FILE* pfWrite);//C++状态

void CommentConvert();

#endif//_COMMENT_COVERT__H_


CommentCovert.c


#define _CRT_SECURE_NO_WARNINGS 1
#include "CommentCovert.h"

State state = NUL_STATE;

void DoConverWork(FILE* pfRead, FILE* pfWrite)//转换工作
{
	while (state != END_STATE)
	{
		switch (state)
		{
		case NUL_STATE:
			DoNulState(pfRead, pfWrite);
			break;
		case C_STATE:
			DoCState(pfRead, pfWrite);
			break;
		case CPP_STATE:
			DoCppState(pfRead, pfWrite);
			break;
		case END_STATE:
			break;
		}
	}
}

void DoNulState(FILE* pfRead, FILE* pfWrite)//无状态
{
	char first = fgetc(pfRead);
	char second;
	switch (first)
	{
	case '/':
			second = fgetc(pfRead);
			if (second == '*')//遇到/*,写入//,转换为c状态
			{
				fputc(first, pfWrite);
				fputc('/', pfWrite);
				state = C_STATE;
			}
			else if (second == '/')//遇到//,写入//,转换为C++状态
			{
				fputc('/', pfWrite);
				fputc('/', pfWrite);
				state = CPP_STATE;
			}
			else//遇到其他,直接写入
			{
				fputc(first, pfWrite);
				fputc(second, pfWrite);
			}
			break;
	case EOF://遇到EOF,转换为结束状态
		state = END_STATE;
		break;
	default:
		fputc(first, pfWrite);
		break;
	}
}

void DoCState(FILE* pfRead, FILE* pfWrite)//c状态
{
	char first = fgetc(pfRead);
	char second;
	switch (first)
	{
	case '*':
		second = fgetc(pfRead);
		if (second == '/')//遇到*/,c状态结束,转换为无状态
		{
			state = NUL_STATE;
			char next = fgetc(pfRead);
			if (next == '\n')//如果 * / 后面是\n,把\n放回去
			{
				ungetc(next, pfRead);
			}
			
			else//如果 * / 后面不是\n,写入\n,把读到的字符放回
			{
				fputc('\n', pfWrite);
				ungetc(next, pfRead);
			}
		}
		else
		{
			fputc(first, pfWrite);
			ungetc(second, pfRead);
		}
		break;
	case EOF:
		state = END_STATE;
		break;
	case '\n':
		fputc(first, pfWrite);
		fputc('/', pfWrite);
		fputc('/', pfWrite);
		break;
	default:
		fputc(first, pfWrite);
		break;
	}
}

void DoCppState(FILE* pfRead, FILE* pfWrite)//C++状态
{
	int first = fgetc(pfRead);
	switch (first)
	{
	case '\n':
		fputc(first, pfWrite);//遇到回车,则进入无状态 
		state = NUL_STATE;
		break;
	case EOF:
		state = END_STATE;
		break;
    default:
		fputc(first, pfWrite);
		break;
	}
}

void CommentConvert()
{
	FILE* pfRead = NULL;
	FILE* pfWrite = NULL;
	pfRead = fopen(INPUT_FILE, "r");//打开文件,读
	if (pfRead == NULL)
	{
		perror("open file for read\n");
		exit(EXIT_FAILURE);
	}
	pfWrite = fopen(OUTPUT_FILE, "w");//打开文件写
	if (pfWrite == NULL)
	{
		perror("open file for write\n");
		fclose(pfRead);
		exit(EXIT_FAILURE);
	}

	DoConverWork(pfRead, pfWrite);//转换工作

	fclose(pfRead);
	fclose(pfWrite);
}


Test.h


#define _CRT_SECURE_NO_WARNINGS 1
#include "CommentCovert.h"

int main()
{
    CommentConvert();
	system("pause");
	return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值