【C语言】注释转换项目实现

编写一个小项目将一个一个文件中的注释都转换成C++的注释风格
设计部分:
(1)头文件模块:包括模块中需要引用的头文件定义,需要实现的主要函数的声明
(2)头文件中主要函数模块的实现:各个函数部分实现的细节
(3)测试函数:检验函数模块的功能
(4)写入一个输入文件

(5)运行结果记入一个输出文件中

主要解决的情况:

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

实现代码:

//CommentConver.h

#ifndef __COMMENT_CONVER_H__
#define __COMMENT_CONVER_H__

#define _CRT_SECURE_NO_WARNINGS 1

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

enum STATE
{
	STATE_NULL,
	STATE_C,
	STATE_CPP,
	STATE_EOF
};

void DoCommentCover(FILE* pfIn, FILE* pfOut);
void DoNULL(FILE* pfIn, FILE* pfOut);
void DoC(FILE* pfIn, FILE* pfOut);
void DoCPP(FILE* pfIn, FILE* pfOut);

#endif

//CommentCover.c

#include "CommentConver.h"
enum STATE state;
void DoNULL(FILE*pfIn,FILE* pfOut)
{
	int first = fgetc(pfIn);
	int second = 0;

	switch (first)
	{
	case'/':
	{
			   second = fgetc(pfIn);
			   if (second == '/')
			   {
				   state = STATE_CPP;
				   fputc(first, pfOut);
				   fputc(second, pfOut);
			   }
			   else if (second == '*')
			   {
				   fputc(first, pfOut);
				   fputc('/', pfOut);
				   state = STATE_C;
			   }
	}
		break;
	case EOF:
		fputc(first, pfOut);
		state = STATE_EOF;
		break;
	default:
		fputc(first, pfOut);
		break;
	}
}

void DoC(FILE* pfIn, FILE* pfOut)
{
	int first = fgetc(pfIn);
	int second = 0;
	int third = 0;
	switch (first)
	{
	case '*':
	{
				second = fgetc(pfIn);
				if (second == '/')
				{
					third = fgetc(pfIn);
					if (third == '\n')
						fputc(third, pfOut);
					else
					{
						ungetc(third, pfIn);
						fputc('\n', pfOut);
					}
					state = STATE_NULL;
				}
				else if (second == '*')
				{
					ungetc(second, pfIn);
					fputc(first, pfOut);
				}
				else
				{
					fputc(first, pfOut);
					fputc(second, pfOut);
				}
	}
		break;
	case '\n':
		fputc(first, pfOut);
		fputc('\n', pfOut);
		fputc('\n', pfOut);
		break;
	case EOF:
		state = STATE_EOF;
	default:
		fputc(first, pfOut);
		break;
	}
}

void DoCPP(FILE* pfIn, FILE* pfOut)
{
	int first = fgetc(pfIn);
	int second = 0;

	switch (first)
	{
	case'\n':
		fputc(first, pfOut);
		state = STATE_NULL;
		break;
	case EOF:
		fputc(first, pfOut);
		state = STATE_EOF;
		break;
	default:
		fputc(first, pfOut);
		break;
	}
}
void DoCommentCover(FILE* pfIn, FILE* pfOut)
{
	state = STATE_NULL;
	int first = 0;
	while (state!=STATE_EOF)
	{
		switch (state)
		{
		case STATE_NULL:
			DoNULL(pfIn, pfOut);
			break;
		case STATE_C:
			DoC(pfIn, pfOut);
			break;
		case STATE_CPP:
			DoCPP(pfIn, pfOut);
			break;
		case STATE_EOF:
			exit(EXIT_FAILURE);
			break;
		default:
			break;
		}
	}
}

//test.c
#include "CommentConver.h"

int main()
{
	FILE *pfIn = fopen("input.c", "r");
	FILE *pfOut = fopen("output.c", "w");
	if (pfIn == NULL)
	{
		perror("input.c");
		exit(EXIT_FAILURE);
	}
	if (pfOut == NULL)
	{
		perror("output.c");
		fclose(pfIn);
	}
	DoCommentCover(pfIn, pfOut);
	printf("转换成功\n");
	fclose(pfIn);
	fclose(pfOut);


	system("pause");
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值