注释转换<C注释-->C++注释>

本文介绍了一个简单的程序,用于将C语言风格的注释转换为C++风格的注释。该程序通过读取源文件并按不同状态进行转换处理,能够应对包括普通语句、C注释、C++注释在内的多种情况。

# 本篇博客为简单的注释转换实现,功能为将简单的C注释段落转换为CPP注释



@ 注意: 代码中所用到的fopen,fwrite,fread等文件操作函数在通讯录文件流博客中做了介


@ ungetc 函数是将从文件中读取的一个字符还回到缓冲区,即文件中去;

@ 分析思路图

@分析思路图



# 自定义头文件部分


#ifndef __COMMENT_CONVERT_H__
#define __COMMENT_CONVERT_H__

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


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

typedef enum CONVERT_START//枚举表示操作选项;
{
	NULL_START,
	C_START,
	CPP_START,
	END_START
}StateType;

void CommentConvert();
void ConvertWork(FILE *read,FILE *write);//注释转换操作选项函数;
void DoCState(FILE *read,FILE *write);//C 转换为 cpp函数;
void DoNullState(FILE *read,FILE *write);//普通语句空转换函数;
void DoCppState(FILE *read,FILE *write);//cpp 转换 C 函数;

#endif //__COMMENT_CONVERT_H__

# 函数功能实现部分:

#define _CRT_SECURE_NO_WARNINGS 1
#include"CommentConvert.h"


StateType state;


void DoNullState(FILE *read,FILE *write)//无转换操作函数;
{
	int first = fgetc(read);
	int second;

	switch(first)
	{
	case'/':
		second = fgetc(read);
		if(second == '*')
		{
			fputc(first,write);
			fputc('/',write);
			state = C_START ;//如果是C注释我们将状态改为C状态,并且将注释开头改为Cpp注释;
		}
		else if(second == '/')
		{
			fputc(first,write);
			fputc(second,write);
			state = CPP_START ; //如果是Cpp注释我们将状态改为Cpp状态;
		}
		else //普通语句就直接写入;
		{
			fputc(first,write);
			fputc(second,write);
		} 
		break;
	case EOF:
		    fputc(first,write);
			state = END_START ;//注释结束,状态调整;
			break;
	default://开始就为普通内容,直接写入;
		fputc(first,write);
		break;
	}
}

void DoCState(FILE *read,FILE *write)//C转换为Cpp;
{
	int first = fgetc(read);
	int second = 0;
	switch(first)
	{
	case '*':
		second = fgetc(read);
		if(second == '/')//舍弃 */;
		{
			int third = fgetc(read);
			state = NULL_START ;
			if(third != '\n')
			{
				fputc('\n',write);
				ungetc(third,read);//ungetc函数的功能是将已读数据还回缓冲区;
				
				
			}
			if(third == '\n')
			{
				fputc(third,write);
			}
		}
		else
		{
			fputc(first,write);
			ungetc(second,read);//将*之后的内容还回缓冲区;
		}
		break;
	case '\n'://如果是换行,那就是连续注释,就将下一行开头加入Cpp注释;
		fputc(first,write);
		fputc('/',write);
		fputc('/',write);
		break;
	case EOF:
		fputc(first,write);
		state = END_START ;
		break;
	default:
		fputc(first,write);
		break;
	}
} 


void DoCppState(FILE *read,FILE *write)//Cpp转换为C;
{
	int first = 0;

	first = fgetc(read);

	switch(first)
	{
	case'\n'://Cpp注释的换行就是一行注释的结束;
		fputc(first,write);
		state = NULL_START ;
		break;
	case EOF:
		fputc(first,write);
		state = END_START ;
		break;
	default :
		fputc(first,write);
		break;
	}
}


void ConvertWork(FILE *read,FILE *write)//函数操作选项;
{
	state = NULL_START ;//一开始我们选择无状态
	while(state != END_START )
	{
		switch(state)
		{
		case NULL_START :
			DoNullState(read,write);
			break;
	    case C_START  :
            DoCState(read,write);
			break;
		case CPP_START  :
			DoCppState(read,write);
			break;
		default:
			break;
		}
	}
}

void CommentConvert()//读写文件函数;
{
	FILE *pWrite = NULL;
	//打开提前编辑好的"input.c"文件;

	FILE *pRead = fopen(INPUTFILENAME,"r");
	if(pRead == NULL)
	{
		perror("open file for read");
		exit(EXIT_FAILURE );
	}

	//写入新创建的"output.c"文件;

	pWrite = fopen(OUTPUTFILENAME, "w");
	if(pWrite == NULL)
	{
		fclose(pRead );
	    perror ("open file for write");
		exit(EXIT_FAILURE );
	}

	//调用操作选项函数;
	//关闭已经打开的文件;

	ConvertWork(pRead,pWrite);
	fclose(pRead );
	fclose (pWrite );
}



# 主函数部分:

#include"CommentConvert.h"

void test()
{
	CommentConvert();
}

int main()
{
	test();

	system("pause");
	return 0;
}


# input.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”

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




简单的注释转换功能, 功能比较单一,有时间我会继续完善!

Ps: 爱拼才会赢!

Thanks!
<?xml version="1.0"?> <package> <name>uav_utils</name> <version>0.0.0</version> <description>The uav_utils package</description> <!-- One maintainer tag required, multiple allowed, one person per tag --> <!-- Example: --> <!-- <maintainer email="jane.doe@example.com">Jane Doe</maintainer> --> <maintainer email="liutianbocn@gmail.com">LIU Tianbo</maintainer> <!-- One license tag required, multiple allowed, one license per tag --> <!-- Commonly used license strings: --> <!-- BSD, MIT, Boost Software License, GPLv2, GPLv3, LGPLv2.1, LGPLv3 --> <license>LGPLv3</license> <!-- Url tags are optional, but mutiple are allowed, one per tag --> <!-- Optional attribute type can be: website, bugtracker, or repository --> <!-- Example: --> <!-- <url type="website">http://wiki.ros.org/geometry_utils</url> --> <!-- Author tags are optional, mutiple are allowed, one per tag --> <!-- Authors do not have to be maintianers, but could be --> <!-- Example: --> <!-- <author email="jane.doe@example.com">Jane Doe</author> --> <!-- The *_depend tags are used to specify dependencies --> <!-- Dependencies can be catkin packages or system dependencies --> <!-- Examples: --> <!-- Use build_depend for packages you need at compile time: --> <!-- <build_depend>message_generation</build_depend> --> <!-- Use buildtool_depend for build tool packages: --> <!-- <buildtool_depend>catkin</buildtool_depend> --> <!-- Use run_depend for packages you need at runtime: --> <!-- <run_depend>message_runtime</run_depend> --> <!-- Use test_depend for packages you need only for testing: --> <!-- <test_depend>gtest</test_depend> --> <buildtool_depend>catkin</buildtool_depend> <build_depend>roscpp </build_depend> <build_depend>rospy </build_depend> <build_depend>cmake_modules </build_depend> <build_depend>cmake_utils </build_depend> <run_depend>roscpp </run_depend> <run_depend>rospy </run_depend> <run_depend>cmake_modules </run_depend> <run_depend>cmake_utils </run_depend> <!-- The export tag contains other, unspecified, tags --> <export> <!-- Other tools can request additional information be placed here --> </export> </package> 注释上述代码保留原注释
最新发布
09-09
<think> 我们被要求注释给定的package.xml代码,并且保留原有的注释。同时,在最后必须提出3-5个相关问题。 注意:原代码中已经有一些注释(以<!--开头和结尾),我们需要保留这些注释,并在适当的位置添加新的注释(用中文)。 我们的注释应该对每个标签进行解释,特别是那些已经填写的标签。同时,我们也可以指出一些缺失的信息(如url和author)以及依赖关系的问题。 按照要求,注释后的代码应该保留原结构,并在每个重要部分加上注释说明。 另外,在回答的最后,我们需要按照格式要求提出3-5个问题,并且第一行必须是“§§相关问题§§”,然后列出问题。 我们注意到,这个package.xml文件是ROS(Robot Operating System)中用于定义包信息的文件。 步骤: 1. 保留所有原有注释。 2. 在原有标签的附近添加新的注释(用中文),解释该标签的作用以及当前内容的意义,也可以指出问题或建议。 3. 注意,添加的注释也要用XML注释格式(<!-- -->)并且不能破坏原有结构。 我们将逐部分进行注释: </think> 以下是对 `uav_utils` ROS包的 `package.xml` 文件的完整注释,保留所有原始注释并添加新的中文说明: ```xml <?xml version="1.0"?> <!-- UAV通用工具包定义文件 --> <package> <!-- 包名称(需在ROS工作空间中唯一) --> <name>uav_utils</name> <!-- 版本号(建议改为正式版本如0.1.0) --> <version>0.0.0</version> <!-- 功能描述(建议扩展具体功能说明) --> <description>The uav_utils package</description> <!-- One maintainer tag required, multiple allowed, one person per tag --> <!-- Example: --> <!-- <maintainer email="jane.doe@example.com">Jane Doe</maintainer> --> <maintainer email="liutianbocn@gmail.com">LIU Tianbo</maintainer> <!-- One license tag required, multiple allowed, one license per tag --> <!-- Commonly used license strings: --> <!-- BSD, MIT, Boost Software License, GPLv2, GPLv3, LGPLv2.1, LGPLv3 --> <!-- LGPLv3协议允许商业使用但要求开源修改 --> <license>LGPLv3</license> <!-- Url tags are optional, but mutiple are allowed, one per tag --> <!-- Optional attribute type can be: website, bugtracker, or repository --> <!-- Example: --> <!-- <url type="website">http://wiki.ros.org/geometry_utils</url> --> <!-- 缺失文档链接(建议添加仓库地址) --> <!-- Author tags are optional, mutiple are allowed, one per tag --> <!-- Authors do not have to be maintianers, but could be --> <!-- Example: --> <!-- <author email="jane.doe@example.com">Jane Doe</author> --> <!-- 缺失作者信息(建议添加主要贡献者) --> <!-- The *_depend tags are used to specify dependencies --> <!-- Dependencies can be catkin packages or system dependencies --> <!-- Examples: --> <!-- Use build_depend for packages you need at compile time: --> <!-- <build_depend>message_generation</build_depend> --> <!-- Use buildtool_depend for build tool packages: --> <!-- <buildtool_depend>catkin</buildtool_depend> --> <!-- Use run_depend for packages you need at runtime: --> <!-- <run_depend>message_runtime</run_depend> --> <!-- Use test_depend for packages you need only for testing: --> <!-- <test_depend>gtest</test_depend> --> <!-- ROS构建系统依赖 --> <buildtool_depend>catkin</buildtool_depend> <!-- 编译依赖 --> <build_depend>roscpp</build_depend> <!-- ROS C++通信库 --> <build_depend>rospy</build_depend> <!-- ROS Python通信库 --> <build_depend>cmake_modules</build_depend> <!-- CMake扩展模块 --> <build_depend>cmake_utils</build_depend> <!-- CMake工具集 --> <!-- 运行时依赖 --> <run_depend>roscpp</run_depend> <!-- C++节点运行时 --> <run_depend>rospy</run_depend> <!-- Python节点运行时 --> <run_depend>cmake_modules</run_depend> <!-- 注意:构建工具通常不应作为运行时依赖 --> <run_depend>cmake_utils</run_depend> <!-- 同上 --> <!-- The export tag contains other, unspecified, tags --> <export> <!-- Other tools can request additional information be placed here --> <!-- 可用于声明插件/元数据(如:<rviz plugin="${prefix}/config.rviz"/>) --> </export> </package> <!-- 完整分析: 1. 基础结构完整但缺少关键元数据(url/author) 2. 依赖配置存在冗余:cmake工具集应仅限构建阶段 3. 无人机专用功能未体现:建议添加mavros/sensor_msgs等依赖 4. 无测试依赖声明:缺少gtest/rostest等测试框架 5. 版本号0.0.0不符合ROS最佳实践 --> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值