注释转换

注释转换

将C语言的注释转化为C++注释

总共有5个状态:

正常代码、遇到/、C风格注释、C++风格注释、遇到*


  •  转换的思路

正常代码(遇到/) --> 遇到/ ,否则将继续处于正常代码

遇到/,如果遇到*进入C注释状态、如果遇到/进入C++注释状态、如果不是这两种那就回到正常代码

C注释状态,如果遇到*,进入遇到*状态,否则继续在C注释状态

C++注释状态,遇到\n进入正常代码,否则保持C++注释状态

遇到*,遇到/进入正常代码状态,遇到*继续在遇到*状态,遇到(*+ch)进入C注释状态

  • 注意

1.进入C注释状态后,要判断是否有\n,如果遇到将输入\n和//

2.进入*状态遇到/后,要判断下一个字符是否为\n,如果不是则要输出一个\n,若是,则直接输出,查看完下一个字符后要归还

3.C风格注释遇到*之后,如果没有遇到/则要将刚才遇到的那个*输出

CommentCnvert.h代码

#ifndef __CommentConvert_H__
#define __CommentConvert_H__

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

typedef enum State
{
	CODE,   //正常代码
	M_XIE_GANG,  //遇到/
	CCODE,  //C风格注释
	CPPCODE,  //C++风格注释
	CM_XING  //遇到*
} State;

void CommentConvertMachine(FILE* pfread, FILE* pfwrite);

#endif // !__CommentConvert_H__


CommentConvert.c

#include "CommentConvert.h"

void CommentConvertMachine(FILE* pfread, FILE* pfwrite)
{
    // 当前状态, CODE 是初始状态
	State state = CODE;
	int ch;
	int nextch;
	while (1)
	{
	    // 从输入文件依次读出一个字符
		ch = fgetc(pfread);
		
		// 处理读完文件的情况
		if (ch == EOF)
		{
			break;
		}


        // 根据当前状态 + 读到的字符,决定下个状态
		switch (state)
		{
		case CODE:
			if (ch == '/')
			{
				state = M_XIE_GANG;
			}
			fputc(ch, pfwrite);
			break;
		case M_XIE_GANG:
			if (ch == '*')
			{
				state = CCODE;
				fputc('/',pfwrite);
			}
			else if (ch == '/')
			{
				state = CPPCODE;
				fputc(ch, pfwrite);
			}
			else
			{
				state = CODE;
				fputc(ch, pfwrite);
			}
			break;
		case CCODE:
			if (ch == '*')
			{
				state = CM_XING;
			}
			else
			{
				fputc(ch, pfwrite);
				if (ch == '\n')
				{
					fprintf(pfwrite, "//");
				}
			}
			break;
		case CPPCODE:
			if (ch == '\n')
			{
				state = CODE;
			}
			fputc(ch, pfwrite);
			break;
		case CM_XING:
			if (ch == '/')
			{
				state = CODE;
				nextch = fgetc(pfread);
				if (nextch != '\n')
				{
					fputc('\n', pfwrite);
				}
				ungetc(nextch, pfread);
			}
			else if (ch != '*')
			{
				state = CCODE;
				fputc('*', pfwrite);
				fputc(ch, pfwrite);
			}
			else
			{
				fputc('*', pfwrite);
			}
			break;
		}
	}
}

test.c

#include "CommentConvert.h"
//有限状态机(Finite State Machine)

void test()
{
	FILE* pfread = NULL;
	FILE* pfwrite = NULL;
	pfread = fopen("input.c","r");
	pfwrite = fopen("output.c", "w");
	if (pfread == NULL)
	{
		perror("fopen input");
		exit(EXIT_FAILURE);
	}
	if (pfwrite == NULL)
	{
		perror("fopen output");
		fclose(pfread);
		exit(EXIT_FAILURE);
	}
	CommentConvertMachine(pfread,pfwrite);
	fclose(pfread);
	fclose(pfwrite);
	pfread = NULL;
	pfwrite = NULL;
}


int main()
{
	test();
	return 0;
}

测试文件input.c

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

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

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

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

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

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

// 7.C++注释问题
// /*xxxxxxxxxxxx*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值