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

一、具体要求:

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

2://   风格的注释保持原样

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

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

二、转换要求:

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

三、注意事项:

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

a.多余的注释符用空格代替

b./* */在注释开始替换为// ,行尾去掉*/

2、注意下面的情形的转换

a. /******/

b.//  /*……*/

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

四、代码:

main.c

#include <stdio.h>
#include <errno.h>
#include <assert.h>

typedef enum STATE
{
	SUCCESS,	// 成功
	FILE_ERROE,	// 文件错误
	NO_MATCH,	// 不匹配
	OTHER,		// 其他错误
}STATE;

typedef enum TAG
{
	TAG_BEGIN,		// 在C注释段中
	TAG_END,		// C注释结束
}TAG;

#pragma warning(disable:4996)

STATE AnnotationConvert(FILE* inFile, FILE* outFile)
{
	TAG tag = TAG_END;
	char firstCh, secondCh;
	assert(inFile);
	assert(outFile);

	do{
		firstCh = fgetc(inFile);
		switch (firstCh){
			// 1.一般情况
			case '/':
				secondCh = fgetc(inFile);
				if (secondCh == '*'
					&& tag == TAG_END)
				{
					fputc('/', outFile);
					fputc('/', outFile);

					// 3.匹配问题
					tag = TAG_BEGIN;
				}
				else if(secondCh == '/')
				{
					char next;
					fputc(firstCh, outFile);
					fputc(secondCh, outFile);

					// 7.C++注释问题
					do
					{
						next = fgetc(inFile);
						fputc(next, outFile);
					} while (next != '\n'
						&& next != EOF);

					// 当读到文件尾时,标记firstCh
					if(next == EOF)
					{
						firstCh = EOF;
					}
				}
				else{
					fputc(firstCh, outFile);
					fputc(secondCh, outFile);
				}

				break;
			case '\n':
				fputc('\n',outFile);

				// 4.多行注释问题
				if (tag == TAG_BEGIN)
				{
					fputc('/',outFile);
					fputc('/',outFile);
				}
				break;
			case '*':
				secondCh = fgetc(inFile);
				if (secondCh == '/')
				{
					// 2.换行问题
					// 5.连续注释问题
					char next = fgetc(inFile);
					if (next != '\n' && next != EOF)
					{
						fseek(inFile, -1, SEEK_CUR);
					}

					fputc('\n', outFile);

					tag = TAG_END;
				}
				else if(secondCh == '*')
				{
					// 6.连续的**/问题
					fseek(inFile, -1, SEEK_CUR);
					fputc(firstCh, outFile);
				}
				else
				{
					fputc(firstCh, outFile);
					fputc(secondCh, outFile);
				}
				break;
			default:
				fputc(firstCh, outFile);
				break;
		}
	}while(firstCh != EOF);

	if(tag == TAG_END)
	{
		return SUCCESS;
	}
	else
	{
		return NO_MATCH;
	}
}

int StartConvert()
{
	STATE s;
	const char* inFileName = "input.c";
	const char* outFileName = "output.c";

	FILE* inFile = fopen(inFileName, "r");
	FILE* outFile = fopen(outFileName, "w");

	if (inFile == NULL)
	{
		return FILE_ERROE;
	}
if (outFile == NULL)
	{
		fclose(inFile);
		return FILE_ERROE;
	}

	s = AnnotationConvert(inFile, outFile);

	fclose(inFile);
	fclose(outFile);

	return s;
}

int main()
{
	STATE ret = StartConvert();

	if (ret == SUCCESS)
	{
		printf("转换成功\n");
	}
	else if (ret == NO_MATCH)
	{
		printf("不匹配\n");
	}
	else if (ret == FILE_ERROE)
	{
		printf("文件错误: %d\n", errno);
	}
	else
	{
		printf("其他错误: %d\n", errno);
	}

	return 0;
}

input.c

// 1.一般情况
/* int i = 0; */

// 2.换行问题
/* 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*/

五、使用环境举例

     当遇到在Windows 下用VC2005环境写程序的时候, 有C++语言写的程序, 但是用了C的注释, 也能成功编译连接运行. 但发现也有很多编译器不支持C的单行注释. 又不想手动地改所有的代码. 将会用到如此一个程序来自动将C的注释替换成C++语言的注释格式.
时间: 2024-10-11 13:31:11

【C语言】注释转换 ——C注释转换为标准C++语言注释的相关文章

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

在一个大型工程当中,由于代码人员的多样性,使得代码的注释风格不同.然而在发布版本中,注释风格应该保持一致,以便于其他人员在后期的使用和维护. 由此,产生了如下的需求: 实现对一个C/C++语言程序源文件中注释的转换功能(在这里 我们实现的是C++注释转换为标准C语言注释) 注释转化的要求: 其他注意事项: 具体分析: 在读取源文件的时候,可能遇到的情况有:  C 风格注释(包含注释的嵌套),C++ 风格注释(包含注释的嵌套),字符中嵌套注释,无注释 ,结束等几种状态. 引入 "状态机"

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

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

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

//input.c中要处理的情况如下 input.c /*int i = 0;*/ /*int y = 0;*/int j = 0; /*int x = 0;/*12345678*/ /* int h = 0; int g = 0; int j = 0; */int q = 0; /**//**/ /* ****** */ // /*1234567890*/ 源文件Annotationconvert.c <span style="font-size:24px;">#incl

注释转换 ——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

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

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

一幅图告诉你&quot;C-&gt;C++&quot;注释转换有多简单

最近做了一个注释转换的项目,将C语言注释转化为C++格式. 也许你刚看到这个题目不知道如何下手,那么恭喜你看了我的博客,我一张简单的图就能告诉你怎样简单处理,看下图. 注释转换的问题 1.一般问题/*int a = 10; */ 2.换行问题/*int a = 10; */int j = 0;/*int a = 10; */int j = 0 3.匹配问题/*int i = 10;/* XXXX*/ 4.多行注释问题/*int i = 0;int j = 0;int k = 0;*/int f

标准SQL语言的用法

原文链接:http://www.ifyao.com/2015/05/18/%E6%A0%87%E5%87%86%E7%9A%84sql%E8%AF%AD%E8%A8%80%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95%E5%8F%8A%E5%A4%9A%E8%A1%A8%E8%BF%9E%E6%8E%A5/ 标准SQL语言的用法 SQL语言是目前最通用的关系数据库语言.ANSI SQL是指由美国国家标准局(ANSI)的数据库委员会制定的标准SQL语言,多数关系数据库产品

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

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

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;