注释转换项目

描述:

利用C语言文件IO来实现C、C++源代码中注释内容的转换:将C注释转换为C++风格的注释

技术特点:

C语言、函数、预处理、文件IO、状态机编程


convert.h

#ifndef __CONVERT_H__
#define __CONVERT_H__

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

#define INPUT "input.txt"
#define OUTPUT "output.txt"

enum status
{
	NULLSTAT,
	CSTAT,
	CPPSTAT,
	EOFSTAT
};
void convert_main();

#endif//__CONVERT_H__


convert.c

#define _CRT_SECURE_NO_WARNINGS
#include "convert.h"

static int status = NULLSTAT;

void do_nullstat(FILE *ipf, FILE *opf)//普通模式
{
	int c = fgetc(ipf);
	switch (c)
	{
	case '/':
	{
				int s = fgetc(ipf);
				switch (s)
				{
				case '/':
					fputc('/', opf);
					fputc('/', opf);
					status = CPPSTAT;//转换到C++注释
					break;
				case '*':
					fputc('/', opf);
					fputc('/', opf);
					status = CSTAT;//转换到C注释
					break;
				case EOF:
					status = EOFSTAT;
					break;
				default:
					fputc('/', opf);
					fputc(s, opf);
					break;
				}
	}
		break;
	case EOF:
		status = EOFSTAT;
		break;
	default:
		fputc(c, opf);
		break;
	}
}

void do_cstat(FILE *ipf, FILE *opf)//C注释
{
	int c = fgetc(ipf);
	switch (c)
	{
	case '*':
	{
				int s = fgetc(ipf);
				switch (s)
				{
				case '/'://注释结尾
					fputc('\n', opf);//换行
					status = NULLSTAT;
					break;
				default:
					ungetc(s, ipf);//排除**/的情况
					status = NULLSTAT;
					break;
				}
	}
		break;
	case '\n'://多行注释
		fputc('\n', opf);
		fputc('/', opf);
		fputc('/', opf);
		break;
	case EOF://文件结尾
		status = EOFSTAT;
		break;
	default://读取下一个字符进行判断
		fputc(c, opf);
		break;
	}
}

void do_cppstat(FILE *ipf, FILE *opf)//C++注释
{
	int c = fgetc(ipf);
	switch (c)
	{
	case '\n':
		fputc('\n', opf);//换行
		break;
	case EOF://文件结尾
		status = EOFSTAT;
		break;
	default://读取下一个字符进行判断
		fputc(c, opf);
		break;
	}
}

static void convert_work(FILE *ipf, FILE *opf)
{
	while (status != EOFSTAT)
	{
		switch (status)//判断模式
		{
		case NULLSTAT:
			do_nullstat(ipf, opf);
			break;
		case CSTAT:
			do_cstat(ipf, opf);
			break;
		case CPPSTAT:
			do_cppstat(ipf, opf);
			break;
		case EOFSTAT:
			break;
		default:
			break;
		}
	}
}

void convert_main()
{
	FILE *ipf = fopen(INPUT, "r");
	FILE *opf = fopen(OUTPUT, "w");
	if (ipf == NULL || opf == NULL)//判断文件是否已打开
	{
		fprintf(stderr, "open file erro\n");
		exit(1);
	}
	convert_work(ipf, opf);
	fclose(ipf);
	fclose(opf);
}


main.c

#include "convert.h"

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


用input.txt和output.txt进行测试





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值