注释转换(c风格转为c++风格)

注释转换

  • 源文件convert.c实现c注释转换为c++注释:

#include<stdio.h>
#include"convert.h"

static int status = NULSTAT;

void do_null_work(FILE *ifp,FILE *ofp)                //普通状态
{
	char c = fgetc(ifp);
	
		switch (c)
		{
		case '/':                                //当读了'/'时,判断下一个字符               
		{
					int s = fgetc(ifp);
					switch (s)
					{
					case '/':                    //   "//"转向c++状态
						fputc('/', ofp);
						fputc('/', ofp);
						s = CPPSTAT;
						break;
					case '*':                    //    "/*"转向c状态
						fputc('/', ofp);
						fputc('/', ofp);
						status = CSTAT;
						break;
					default:                     //   仍为普通状态
						ungetc(s, ifp);          //   需要后退一个字符,将前一个字符输出
						fputc(c, ofp);
						break;
					}
		}
			break;
		case EOF:                           //必须考虑文件结束标志,否则进入死循环
			status = EOFSTAT;
			break;
		default:
			fputc(c, ofp);
			status = NULSTAT;
			break;
		}
}
void do_cpp_work(FILE *ifp,FILE *ofp)       //cpp状态相关操作
{
	char c = fgetc(ifp);
	
		switch (c)
		{
		case '\n':                                
			fputc('\n', ofp);
			break;
		case EOF:
			status = EOFSTAT;
			break;
		default:
			fputc(c, ofp);
			status = CPPSTAT;
			break;
		}
	
}
void do_c_work(FILE *ifp,FILE *ofp)          //c状态下相关操作
{
	char c = fgetc(ifp);
		switch (c)
		{
		case '*':
		{
					char s = fgetc(ifp);
					switch (s)
					{
					case '/':
						fputc('\n', ofp);
						status = NULSTAT;
						break;
					default:
						ungetc(s, ifp);
						fputc(c, ofp);
						break;
					}
		}
			break;
		case '\n':
			fputc('\n', ofp);
			fputc('/', ofp);
			fputc('/', ofp);
			break;
		case EOF:
			status = EOFSTAT;
			break;
		default:
			fputc(c, ofp);
			status = CSTAT;
			break;
		}
}

void convert(FILE *ifp, FILE *ofp)
{
	while (status != EOFSTAT)
	{
		switch (status)
		{
		case NULSTAT:
			do_null_work(ifp, ofp);
			break;
		case CPPSTAT:
			do_cpp_work(ifp, ofp);
			break;
		case CSTAT:
			do_c_work(ifp, ofp);
			break;
		case EOFSTAT:
			break;
		default:
			break;
		}
	}	
}
  • 提供给外部接口包含头文件convert.h
//#pragma   once		         //防止头文件被重复引用   1.
#ifndef __CONVER_H__                    //                       2.
#define __CONVER_H__

enum{NULSTAT,CSTAT,CPPSTAT,EOFSTAT};    //枚举类型定义四种状态,标志当前所处的状态

void convert(FILE *ifp, FILE *ofp);

#endif
  • 测试代码main.c
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>                     //库包含文件定义在自己定义的包含文件之前,防止隐式包含
#include<stdlib.h>
#include"convert.h"
#define INPUT "input.txt"
#define OUTPUT "output.txt"

int main()
{
	FILE *ifp=fopen(INPUT, "r");
	FILE *ofp = fopen(OUTPUT,"w");

	if (ifp == NULL || ofp == NULL)
	{
		perror("file open erro");
		exit(1);
	}
	convert(ifp, ofp);

	fclose(ifp);
	fclose(ofp);

	system("pause");
	return 0;
}

  • 测试用例 input.txt
// 1. 一般情况
int num = 0;
/* 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. 连续注释问题
/*int a = 0;*//*int b = 0;*/
// 6. 连续的 **/问题
/***/
// 7.C++ 注释问题
// /*xxxxxxxxxxxx*/

  • 转换结果output.txt
// 1. 一般情况
int num = 0;
// 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. 连续注释问题
//int a = 0;
//int b = 0;

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

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














  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值