C语言实现注释转换

此篇博客主要写如何将c风格注释(/*xxx*/)转换为c++风格注释(//xxx).

下图即为注释转换的过程图:

#include<stdio.h>

typedef enum State
{
	Normal,
	FOUND_SLAH,//找到/
	CPP_State,
	C_State,
	FOUND_START//找到*
}State;

int main()
{
	FILE* input = fopen("input.c","r");
	if (input == NULL) {
		perror("");
		return 0;
	}
	FILE* output = fopen("output.c", "w");
	if (output == NULL){
		perror("");
		return 0;
	}
	State state = Normal;
	int ch, nextch;
	while (1)
	{
		ch = fgetc(input);
		if (ch == EOF)
		{
			break;
		}
		switch (state)
		{
		case Normal:
			if (ch == '/')
			{ 
				fputc(ch, output);
				state = FOUND_SLAH;
			}
			else
			{
				fputc(ch, output);
				state = Normal;
			}
			break;
		case CPP_State:

			if (ch == '\n')
			{
				fputc(ch, output);
				state = Normal;
			}

			else
			{
				fputc(ch, output);
				state = CPP_State;
			}
			break;
		case FOUND_SLAH:
			//fputc(ch, output);
			if (ch == '/')
			{
				fputc(ch, output);
				state = CPP_State;
			}
			else if (ch == '*')
			{
				//nextch = ch;
				fputc('/', output);
				state = C_State;
			}
			else {
				fputc(ch, output);
				state = Normal;
			}
			break;

		case C_State:
			if (ch == '*')
			{
				state = FOUND_START;

			}
			if (ch != '*')
			{
				fputc(ch, output);
				if (ch == '\n')
				{
					fprintf(output,"//");
				}
				state = C_State;
			}
			break;
		case FOUND_START:

			if (ch == '*') {
				fputc('*', output);
				state = FOUND_START;
			}
			else if (ch == '/')
				//注释转换后回到普通模式
				/* hello */
			{
				nextch = fgetc(input);
				if (nextch  != '\n')
					fputc('\n', output);
				ungetc(nextch,input);
				state = Normal;
			} 
			else {
				// *之后没有/回到C风格
				fputc('*', output);
				fputc(ch, output);
				state = C_State;
			}
			break;
		}
	}
	fclose(input);
	fclose(output);
	return 0;
}

测试代码:

// 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*/

转换结果:

// 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、付费专栏及课程。

余额充值