【小项目】注释风格转换(从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;/*xxxxx*/

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

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

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

// 7.C++注释问题
// /*xxxxxxxxxxxx*/

这个程序,我觉得最难的部分就是把逻辑弄清楚,之后再慢慢的实现,在程序没有语法错误的时候,根据结果文件output.c来查找是哪里的问题就比较容易了。

接下来看看我的实现,先看主函数部分,主要功能就是打开两个文件

#include"CommentConvert.h"

int main()
{
	
	FILE *pfRead = NULL;
	FILE *pfWrite = NULL;
	printf("转换开始\n");
	pfRead = fopen(INPUTFILENAME, "r");
	if (NULL == pfRead)
	{
		perror("open file for read");
		exit(EXIT_FAILURE);
	}
	pfWrite = fopen(OUTPUTFILENAME, "w");
	if (NULL == pfWrite)
	{
		fclose(pfRead);
		perror("open file for write");
		exit(EXIT_FAILURE);
	}
	CommentConvert(pfRead, pfWrite);
	printf("转换结束\n");
	fclose(pfRead);
	fclose(pfWrite);
	getchar();
	return 0;
}
函数实现:
#include"CommentConvert.h"

void CommentConvert(FILE *pfRead, FILE *pfWrite)
{
	state = NUL_STATE;
	while (state != END_STATE)
	{
		switch (state)
		{
		case NUL_STATE:
			Do_NUL_State(pfRead, pfWrite);
			break;
		case C_STARE:
			Do_C_State(pfRead, pfWrite);
			break;
		case CPP_STATE:
			Do_Cpp_State(pfRead, pfWrite);
			break;
		case END_STATE:
			break;
		}

	}
}
void Do_NUL_State(FILE *pfRead, FILE *pfWrite)
{
	int first = 0;
	int second = 0;
	first = fgetc(pfRead);
	switch (first)
	{
	case '/':
		second = fgetc(pfRead);
		if (second == '*')
		{
			fputc('/', pfWrite);
			fputc('/', pfWrite);
			state = C_STARE;
		}
		else if (second == '/')
		{
			fputc(first, pfWrite);
			fputc(second, pfWrite);
			state = CPP_STATE;
		}
		else
		{
			fputc(first, pfWrite);
			fputc(second, pfWrite);
		}
		break;
	case EOF:
		fputc(first, pfWrite);
		state = END_STATE;
		break;
	default:
		fputc(first, pfWrite);
		break;
	}
}

void Do_C_State(FILE *pfRead, FILE *pfWrite)
{
	int first = 0;
	int second = 0;
	first = fgetc(pfRead);
	switch (first)
	{
	
	case '\n':
		fputc('\n', pfWrite);
		fputc('/', pfWrite);
		fputc('/', pfWrite);
		break;
	case'*':
		second = fgetc(pfRead);
		if (second == '/')
		{
			state = NUL_STATE;
			first = fgetc(pfRead);
			if (first != '\n')
				{
				fputc('\n', pfWrite);
				ungetc(first, pfRead);
			    }
			else
			    {
				fputc('\n', pfWrite);
			    }
	
		}
		else if (second == '*')
		{
			fputc(first, pfWrite);
			ungetc(second,pfRead);
			//first = fgetc(pfRead);
			/*if (first == '/')
			{
				fputc('\n', pfWrite);
				state = NUL_STATE;
			}*/
		}
		else
		{
			fputc(first, pfWrite);
			fputc(second, pfWrite);
		}
		break;
	
	case EOF:
		fputc(first, pfWrite);
		state = END_STATE;
		break;
	default:
		fputc(first, pfWrite);
		break;
	}
}

void Do_Cpp_State(FILE *pfRead, FILE *pfWrite)
{
	int first = 0;
	int second = 0;
	first = fgetc(pfRead);
	switch (first)
	{
	case'/':
		second = fgetc(pfRead);
		if (second == '*')
		{
			fputc(first, pfWrite);
			fputc(second, pfWrite);
		}
		else if (second == '/')
		{
			fputc(first, pfWrite);
			fputc(second, pfWrite);
			state = NUL_STATE;
		}
		else
		{
			fputc(first, pfWrite);
			fputc(second, pfWrite);
		}
		break;
	case'\n':
			fputc(first, pfWrite);
			state = NUL_STATE;
		break;
	case'*':
		second = fgetc(pfRead);
		if (second == '/')
		{
			fputc(first, pfWrite);
			fputc(second, pfWrite);
		}
		else if (second == '*')
		{
			fputc(first, pfWrite);
			ungetc(second, pfRead);
		}
		break;
	case EOF:
		/*fputc(first, pfWrite);*/
		state = END_STATE;
		break;
	default:
		fputc(first, pfWrite);
		break;
	}
}
头文件
#define _CRT_SECURE_NO_WARNINGS 1 
#ifndef _COMCON_
#define _COMCON_
#include<stdio.h>
#include<stdlib.h>

#define INPUTFILENAME "input.c"
#define OUTPUTFILENAME "output.c"

enum STATE
{
	NUL_STATE,
	C_STARE,
	CPP_STATE,
	END_STATE
};
enum STATE state;

void CommentConvert(FILE *pfRead, FILE *pfWrite);
void Do_NUL_State(FILE *pfRead, FILE *pfWrite);
void Do_C_State(FILE *pfRead, FILE *pfWrite);
void Do_Cpp_State(FILE *pfRead, FILE *pfWrite);




#endif
正确的output.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、付费专栏及课程。

余额充值