注释转换(C++到C)

在注释转换的学习中,仍有很多不足,希望大家可以批评改正,谢谢~

满足条件:

1.C++风格的注释//注释转换为标准C分风格/* */注释

2./*  */风格的注释保持原样

3.所有的转换需要符合语法规则

4.注释转换需要支持注释嵌套

注释转换要求:

注释的嵌套情形很多,这里只是举例,你需要遵照C/C++语言的注释规则来编写代码,我不会仅测试这里的例子。

1、单行注释或没有嵌套,注释行直接转换,如:

①//123                             /* 123 */

②/* 123 */                       /* 123 */ 不变

③/*123

*/                                   保持原样

2、有嵌套的注释(一个注释中还有嵌套其他注释符号//,/* */)嵌套中多余的每个注释符号用两个空格代替。

如单行:

① //123 /*456 */                            /*123   456*/

②//123//456                                   /*123   456*/

③//123*//*456                               /*123     456*/

如跨行

/*……..                                         /*……..

//………                                        ……….

// ……..                                         ……….

*/                                                    */

注意:

1、除以下两种情况的修改,源文件转换后不能有任何其它的修改:

①多余的注释符用空格代替

②//在注释开始替换为/* ,行尾增加*/

2、下面的3种情形无需转换

① /* 123 */ /* 456 */

②/* 123 */ /* 456

*/

③/* 123

*/ /* 456

*/

3、不需要考虑输入文件中不符合语法规则的注释

具体代码如下:

函数实现:

#include<iostream>
using namespace std;

extern int CommentConvert(FILE *inputfile, FILE *outputfile);   //外部函数声明
typedef enum                                                    //枚举
{
	NO_COMMENT_STATE,                                           //没有注释
	C_COMMENT_STATE,                                            //C注释
	CPP_COMMENT_STATE,                                          //C++注释
	STR_STATE,                                                  //开始
	END_STATE                                                   //结束
}STATE_ENUM;

typedef struct                                                  //结构体
{
	FILE *inputfile;                                            //文件输入指针
	FILE *outputfile;                                           //文件输出指针
	STATE_ENUM ulstate;                                         //标志
}STATE_MACHINE;

//
STATE_MACHINE g_state = {0};                                    //初始化

///////////////////////////////////////////////////
void EventPro(char ch);                                        //状态选择
void EventProAtNo(char ch);                                    //无注释
void EventProAtC(char ch);                                     //C注释
void EventProAtCpp(char ch);                                   //C++注释
void EventProAtStr(char ch);                                   //字符串内注释
////////////////////////////////////////////////////

int CommentConvert(FILE *inputfile, FILE *outputfile)          //注释转换函数
{
	if(inputfile==NULL || outputfile==NULL)
	{
		cout<<"input argument Invalid!"<<endl;
		return -1;
	}

	g_state.inputfile = inputfile;                             //初始化
	g_state.outputfile = outputfile;
	g_state.ulstate = NO_COMMENT_STATE;

	char ch;
	while(g_state.ulstate != END_STATE)                        //判断条件
	{
		ch = fgetc(g_state.inputfile);
		EventPro(ch);
	}
	return 0;
}

void EventPro(char ch)                                         //状态选择
{
	switch(g_state.ulstate)
	{
	case NO_COMMENT_STATE:
		EventProAtNo(ch);
		break;
	case C_COMMENT_STATE:
		EventProAtC(ch);
		break;
	case CPP_COMMENT_STATE:
		EventProAtCpp(ch);
		break;
	case STR_STATE:
		EventProAtStr(ch);
		break;
	case END_STATE:
		break;
	}
}
//C++//  C /**/
void EventProAtNo(char ch)
{
	char nextch;
	switch(ch)
	{
/*	case '"':
		EventProAtStr(ch);
		break;*/
	case '/':   // // /*
		nextch = fgetc(g_state.inputfile);
		if(nextch == '/') // C++
		{
			fputc('/',g_state.outputfile);
			fputc('*',g_state.outputfile);
			g_state.ulstate = CPP_COMMENT_STATE;
		}
		else if(nextch == '*') //C
		{
			fputc(ch,g_state.outputfile);
			fputc(nextch,g_state.outputfile);
			g_state.ulstate = C_COMMENT_STATE;
		}
		break;
	case '*':
		nextch = fgetc(g_state.inputfile);
		if(nextch == '/') // C++
		{
			fputc(ch,g_state.outputfile);
			fputc(nextch,g_state.outputfile);
			g_state.ulstate = NO_COMMENT_STATE;
		}
		break;
	case EOF:
		g_state.ulstate = END_STATE;
		break;
	default:
		fputc(ch,g_state.outputfile);
		break;
	}
}
void EventProAtC(char ch)
{
	char nextch;
	switch(ch)
	{
	case '*':
		nextch = fgetc(g_state.inputfile);
		if(nextch == '/')
		{
			fputc(' ',g_state.outputfile);
			fputc(' ',g_state.outputfile);
			g_state.ulstate = C_COMMENT_STATE;
		}
		break;
	case '/':
		nextch = fgetc(g_state.inputfile);
		if(nextch == '/')
		{
			fputc(' ',g_state.outputfile);
			fputc(' ',g_state.outputfile);
			g_state.ulstate = CPP_COMMENT_STATE;
		}
		else if(nextch == '*')
		{
			fputc(' ',g_state.outputfile);
			fputc(' ',g_state.outputfile);
			g_state.ulstate = NO_COMMENT_STATE;
		}
		break;
	case EOF:
		fputc('*',g_state.outputfile);
		fputc('/',g_state.outputfile);
		g_state.ulstate = END_STATE;
		break;
	default:
		fputc(ch,g_state.outputfile);
		break;
	}
}
void EventProAtCpp(char ch)
{
	//123  /*123
	char nextch;
	switch(ch)
	{
	case '/':
		nextch = fgetc(g_state.inputfile);
		if(nextch == '/') // C++
		{
			fputc(' ',g_state.outputfile);
			fputc(' ',g_state.outputfile);
			g_state.ulstate = CPP_COMMENT_STATE;
		}
		else if(nextch == '*')
		{
			fputc(' ',g_state.outputfile);
			fputc(' ',g_state.outputfile);
			g_state.ulstate = C_COMMENT_STATE;
		}
		break;
	case '*':
		nextch = fgetc(g_state.inputfile);
		if(nextch == '/')
		{
			fputc(ch,g_state.outputfile);
			fputc(nextch,g_state.outputfile);
			g_state.ulstate = NO_COMMENT_STATE;
		}
		break;
	case EOF:
		fputc('*',g_state.outputfile);
		fputc('/',g_state.outputfile);
		g_state.ulstate = END_STATE;
		break;
	default:
		fputc(ch,g_state.outputfile);
		break;
	}
}
void EventProAtStr(char ch)//对于这个没有了解是如何操作的,在后期学习中会改进
{
/*	fputc(ch,g_state.outputfile);*/
}

主函数:

#include<iostream>
using namespace std;

extern int CommentConvert(FILE *inputfile, FILE *outputfile);

//VC -->

/***************************************
 *Function name: main
 *Function Dis:
 *input argu  : void
 *output argu : 0 OK
                -1 Error
 what   why   when   who

 ***************************************/

int main()
{
	FILE *fpIn = NULL;  //inputfile
	FILE *fpOut = NULL; //outputfile

	fpIn = fopen("input.c","r");              //只读方式打开
	if(NULL == fpIn)
	{
		cout<<"Open input file fail!"<<endl;
		return -1;
	}
	fpOut = fopen("output.c","w");            //只写方式打开
	if(NULL == fpOut)
	{
		cout<<"Open output file fail!"<<endl;
		return -1;
	}

	CommentConvert(fpIn,fpOut);              //调用注释转换

	fclose(fpIn);                            //关闭
	fclose(fpOut);
	return 0;
}
时间: 2024-10-03 19:08:43

注释转换(C++到C)的相关文章

注释转换

注释转换: 由C语言的注释全部转换为C++的注释风格. 什么是有限状态机? 有限状态机FSM是软件上常用的一种处理方法,它把复杂的控制逻辑分解成有限个稳定状态,在每个状态上进行处理. 有限状态机是闭环系统,可以用有限的状态,处理无穷的事务. // 通常我们使多路分之语句来处理状态机 switch (state) { case 1: // ... break ; case 2: // ... break ; case 3: // ... break ; . . . case n : break ;

c语言走向c++的第一步,注释转换

最近刚开始学习c++,接触了一个小项目,写一个程序将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;

注释转换——(小项目)

一门计算机语言如果想要运用的得心应手,离不开长久的练习,针对C语言的用法,下面主要是用C语言来解决注释转换的问题,C语言中注释是以"/*"开始,以"*/"结束,C++语言中可以通过"//"来注释,这里不考虑C++语言向下兼容C语言的特点,主要是想将"/*       */"注释符转换为"//     ".对于各种的注释情况,程序中能够实现各种各样的注释能够进行转换. 以下是一般人在编写程序时"注释

C# : 操作Word文件的API - (将C# source中的xml注释转换成word文档)

这篇博客将要讨论的是关于: 如何从C#的source以及注释, 生成一份Word格式的关于各个类,函数以及成员变量的说明文档. 他的大背景如下...... 最近的一个项目使用C#, 分N个模块, 在项目的里程碑的时候, 日本的总公司要检查我们的成果物. 成果物包括源代码, 概要设计式样书(SD,System Design), 详细设计式样书(PD, Program Design), 自动化测试等等. 源代码必须要符合编码规范(每个函数都要有注释, 方法变量的命名规则等...) 这些检查都很正常,

注释转换(C语言-&gt;C++)

最近做了一个注释转换的项目,将C语言注释转化为C++格式. 在这个项目中,我用到了有限状态机的思想.有限状态机,简称为状态机(finite-state machine),是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型. 我先来介绍一下状态机.状态机简写为FSM(Finite State Machine),主要分为2大类:第一类,若输出只和状态有关而与输入无关,则称为Moore状态机:第二类,输出不仅和状态有关而且和输入有关系,则称为Mealy状态机.要特别注意的是,因为Mealy

小小的项目——简单的注释转换

StdAfx.h文件实现各种预定义. #ifndef _STDAFX_H #define _STDAFX_H #define UL unsigned long #endif constd编写相应的实现方法. #include<stdio.h> #include<stdlib.h> #include"StdAfx.h" extern "C" void converter(FILE *input,FILE *output); //表示以C的环境访

c语言项目—注释转换(c——c++)

题目要求: 要将全部的c语言风格的注释转换为c++风格的注释,如下图所示,需要将input.c文件经过注释转换程序转换为output.c文件所示. 这是测试结果: 首先我们来分析一下这个题目,在做这个项目时,我们需要引进有限状态机这个概念.那我们先来了解一下什么是有限状态机. 有限状态机FSM是软件上一种常用的处理方法,他把复杂的控制逻辑分成有限个稳定状态,在每个状态上进行处理. 我们来画一下状态图: 所以我们把这个项目分成这几个状态. NUL_STATE, C_STATE,  CPP_STAT

注释转换??——C++注释转换为标准C语言注释

编写注释转化程序,实现对一个C/C++语言程序源文件中注释的转换功能 1.C++风格的注释//注释转换为标准C分风格/* */注释 2./* */风格的注释保持原样 3.所有的转换需要符合语法规则 4.注释转换需要支持注释嵌套 注释转化要求: 注释的嵌套情形很多,这里只是举例,你需要遵照C/C++语言的注释规则来编写代码,我不会仅测试这里的例子. 1.单行注释或没有嵌套,注释行直接转换,如: ①//123 /* 123 */ ②/* 123 / / 123 */ 不变 ③/*123 */ 保持原

【C语言】注释转换 ——C注释转换为标准C++语言注释

一.具体要求: 1:C风格的注释/* */注释转换为标准C++风格//注释 2://   风格的注释保持原样 3:所有的转换需要符合语法规则 4:注释转换需要支持注释嵌套 二.转换要求: 注释的嵌套情形很多,这里只是举例,你需要遵照C/C++语言的注释规则来编写代码,我不会仅测试这里的例子.                                                          三.注意事项: 1.除以下两种情况的修改,源文件转换后不能有任何其它的修改: a.多余的注释

注释转换 ——C注释转换为标准C++注释

http://blog.csdn.net/fujinlong520/article/details/46573445注释转换 --C++注释转换为标准C语言注释 直接上代码: <span style="color:#ff0000;"> #include<stdio.h> #include <errno.h> #include <assert.h> typedef enum STATE { SUCCESS, // 转换成功 FILE_ERR