【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;

*/int k = 0;

// 5.连续注释问题

/**//**/

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

/***/

// 7.C++注释问题

// /*xxxxxxxxxxxx*/

// 8.C注释本身不匹配

/* int i = 0;

//9.在引号“”之中的注释

对于任何一个项目。我们应该将复杂化的项目简单化。我们一步一步的去完善我们的程序。首先从第一项慢慢添加各种情况的功能。考虑每步的准确性,然后在统一进行最后的测试。

代码可能有点长,但是基本的原理还是比较简单的。一步一步去做。就能够做出来的~

下面给出代码,有一些简单的注释,不难理解,无非就是一步一步完善而已:

#include <stdio.h>
#include <assert.h>
typedef enum Flag
{
	ANNOTATION_START = 0,//在注释之中
	ANNOTATION_END = 1//注释已经成对,在注释之外。
}Flag;

typedef enum State
{
	SUCCESS,    //转换成功
	FILE_ERROR,//文件出现错误
	MATCH_ERROR,    //注释出现匹配错误。
	OTHER_ERROR,    //其他错误
}State;
State AnnotationConrent(char firstCh,char secondCh)
{
	FILE *In = fopen("In.c","r");
	FILE *Out = fopen("Out.c","w");
	State ret;
	Flag tag =	ANNOTATION_END;
	if(NULL == In)
	{
		return FILE_ERROR;
	}
	if(NULL == Out)
	{
		fclose(In);
		return  FILE_ERROR;
	}

	//1.普通注释
	do{
		firstCh = fgetc(In);
		switch(firstCh)
		{ 
		case ‘"‘:
			{//9.在引号之中的注释
				char next;
				fputc(firstCh,Out);
				while(‘"‘ != (next = fgetc(In)))
				{
					fputc(next,Out);
				}
				fputc(next,Out);
				break;
			}
		case ‘/‘:
			{
				secondCh = fgetc(In);
				//3.匹配问题
				if(‘/‘ == secondCh)
				{
					fputc(firstCh,Out);
					fputc(secondCh,Out);
					while(‘\n‘ != (firstCh = fgetc(In))&& (EOF != firstCh))
					{
						fputc(firstCh,Out);
					}
					fputc(‘\n‘,Out);
				}
				else if(‘*‘ == secondCh && ANNOTATION_END == tag)
				{
					secondCh = ‘/‘;
					fputc(firstCh,Out);
					fputc(secondCh,Out);
					tag = ANNOTATION_START;
					ret = MATCH_ERROR;
				}
				else 
				{
					fputc(firstCh,Out);
					fputc(secondCh,Out);
				}
				break;
			}
		case‘\n‘:
			{
				fputc(‘\n‘,Out);
				//5.多行注释情况。
				if(ANNOTATION_START == tag)
				{
					fputc(‘\n‘,Out);
					fputc(‘/‘,Out);
					fputc(‘/‘,Out);
				}
				break;
			}
		case ‘*‘:
			{
				char next;
				secondCh = fgetc(In);
				//6.连续注释/***/
				if(‘*‘ == secondCh)
				{
					fputc(firstCh,Out);
					fseek(In,-1,SEEK_CUR);
				}
				if(‘/‘ == secondCh)
				{
					next = fgetc(In);
					// 2.换行问题
					if(EOF == next)
					{
						firstCh = EOF;
					}
					else if(‘\n‘ != next)
					{//5.连续注释/**//**/
						fputc(‘\n‘,Out);
						fseek(In,-1,SEEK_CUR);
					}
					else if(‘\n‘ == next)
					{
						fputc(‘\n‘,Out);
					}
					tag = ANNOTATION_END;

					//8.注释错误
					ret = SUCCESS;
				}
				break;
			}
		default:
			{
				fputc(firstCh,Out);
				break;
			}
		}
	}while(EOF != firstCh);
	if(ANNOTATION_START == tag)
	{ //注释错误
		ret =OTHER_ERROR;
	}
	fclose(In);
	fclose(Out);
	return ret;
}

int main()
{
	char firstCh = 0;
	char secondCh =0;
	State Sta ;
	Sta = AnnotationConrent(firstCh,secondCh);
	if(SUCCESS == Sta)
	{
		printf("转换成功");
	}
	else if(FILE_ERROR == Sta)
	{
		printf("文件打开错误");
	}
	else if(MATCH_ERROR == Sta)
	{
		printf("注释匹配错误");
	}
	else if(OTHER_ERROR == Sta)
	{
		printf("其它错误");
	}
	return 0;
}

在任何项目中,标准的命名规范更容易加强对于程序的易见性。

OK,项目是慢慢看出来的。就这样。

时间: 2024-11-09 00:05:45

【C项目】注释转换项目的相关文章

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

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

C语言小项目—注释转换

本次这个小项目的目的是把.c文件中的C风格的注释转换成为C++风格的注释. C注释风格:/**/ C++注释风格:// 首先我们分析一下会出现的几种状态,以及各种状态之间的转换关系: 首先我们在这里对一些状态进行了标注,我们这里已知的有4种状态, 第一种是END_STATE 第二种是C_STATE 第三种是CPP_STATE 第四种是我们平时的NULL_state. 在这里,注释转换操作的是文件,所以接下来我么采用文件操作. 首先我们要打开input.c文件,对这个文件内部的文件进行读取,然后处

注释转换项目

注意事项: (1)中英文状态下 (2)在c语言中变量的声明要放在函数开头的最前边 (3)对于代码比较长的工程应该写完一小部分然后测试,这样可以提高效率,不要等到把所有的代码都写完以后在测试这种方法不可取. (4)第二次打开失败,在这种状况下可能第一次打开文件时成功也有可能是失败.为了避免错误,在第二次打开文件之前应该关闭第一次打开的文件 . (5)如果文件存在,但依旧打开失败,借助errno可以看到具体的错误是什么(在工具窗口输入具体的错误码,即可知道错误原因) 例如:当前我写的程序错误码为2,

注释转换——(小项目)

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

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

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的环境访

Myeclipse导入项目注释乱码问题的解决

参考的博客地址: http://blog.csdn.net/gaijianwei/article/details/20830445 今天导入 一个JSP 项目,注释 出现 乱码!(一般是不会发生的!) 原因是因为,我的项目是 GBK编码, 目前只要是国内的项目,一般都是吧(哈哈 有点绝对了),然而,我的MyEclispe 设置默认编码 的是UTF-8 !所以,在单击项目右键的时候,选择 属相栏,并没有 GBK项目! 如图:(今天不知怎么的 传不上 图片) 第一步: 修改 工作空间的 编码: 修改

个人项目—语言转换

个人项目 语言转换 姓名:任鑫 学号:201303011149 班级:计科13-1 时间:2015/4/24 一.题目介绍 通过键盘输入整数N表示要输入几行,然后输入N行字符,输入一行后接着输出相应的转换后的内容或者Error,输入N行后,程序结束 二.源码的github链接 https://github.com/caonimei12/test/tree/master 三.所设计的模块测试用例.测试结果绘图 package com.langxi.test; import static org.j

iOS端项目注释规范附统一代码块

代码的注释经常被人忽略,以至于在后期维护的时候较为困难.我们准备在XX项目开始之前制定一套规范的注释体系,致力于达到就算维护人员改变也能快速上手的效果. 1.属性注释 属性注释 使用 /** 注释*/ 的文档注释格式. 这种注释相较于// 注释的优点是此属性可以在后面的引用时,在智能提示的下方显示中文注释 如果你不是在董铂然博客园看到本文请点击查看原文. 例如: /** 回复率*/ @property(nonatomic,strong)MTPoiCompareM *replyRate; /**

Ecplise项目和AndroidStudio项目之间的转换

Ecplise项目和AndroidStudio项目之间的转换 为了帮助一些刚接触AndroidStudio的童鞋,在这里我把自己琢磨出来的一点经验分享给大家!Ecplise项目变为AS项目有两种方式,一种只不改变原有的项目结构,只是用AS进行编译Ecplise项目(适合Ecplise和AS共存的的开发),另一种是改变目录结构,和新建AS项目一样使用Gradle进行编译. 直接使用AndroidStudio打开Ecplise项目 在Ecplise项目结构如下图 找到工程的文件路径 接下来打开AS