c语言注释转换(c注释转换成c++注释)

news/2024/7/5 3:49:07

代码思路:

              

分为四个模式 NUL_格式(开始读取注释)、c格式、c++格式、END模式  (结束程序)

input.c:  7种 情况

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

代码:

(1)头文件 CommentConvert.h 

   

#ifndef __COMMENTCONVERT_H__
#define __COMMENTCONVERT_H__

#define _CRT_SECURE_NO_WARNINGS 1 

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

enum STATE 
{
	NUL_STATE,
	C_STATE,
	CPP_STATE,
	END_STATE
};

void CommentConvert();    //初始化
void DoConvert(FILE *pfIn,FILE *pfOut,enum STATE *psta);  //开始转换
void NulConvert(FILE *pfIn, FILE *pfOut, enum STATE *psta); 
void CConvert(FILE *pfIn, FILE *pfOut, enum STATE *psta);
void CppCovert(FILE *pfIn, FILE *pfOut, enum STATE *psta);

#endif

(2) CommentCovert.

#include"CommentConvert.h"

void CommentConvert()
{
	enum STATE psta = NUL_STATE;
	FILE *pfIn = fopen("input.c","r"); //打开input.c流
	if (pfIn == NULL)
	{
		perror("input.c");
		exit(EXIT_FAILURE);
	}
	FILE *pfOut = fopen("output.c", "w"); //打开 output.c流
	if (pfOut == NULL)
	{
		perror("output");
		fclose(pfIn);
		exit(EXIT_FAILURE);
	}
	DoConvert(pfIn, pfOut, &psta);
	fclose(pfIn);
	fclose(pfOut);
}
void DoConvert(FILE *pfIn, FILE *pfOut, enum STATE *psta)
{
	while (*psta != END_STATE)
	{
		switch (*psta)
		{
		case C_STATE:
			CConvert(pfIn, pfOut, psta);
			break;
		case CPP_STATE:
			CppCovert(pfIn, pfOut, psta);
			break;
		case NUL_STATE:
			NulConvert(pfIn, pfOut, psta);
			break;
		default:
			break;
		}
	}
	printf("转换成功!\n");
}
void NulConvert(FILE *pfIn, FILE *pfOut, enum STATE *psta)
{
	int first = 0;
	int second = 0;
	first = fgetc(pfIn);   //读取第一个字符
	switch (first)
	{
	case '/' :
				
		second = fgetc(pfIn);   //读取第二个字符
		switch (second)
		{
		case '*':              // 读取到/*  进入c格式
			fputc('/',pfOut);
			fputc('/', pfOut);
			*psta = C_STATE;    
			break;
		case '/':             //  读取到//   进入c++ 模式
			fputc('/', pfOut);
			fputc('/', pfOut);
			*psta = CPP_STATE;
			break;
		default:             //     表示 没有  开始转换  
			ungetc(second,pfIn);      //   第二个字符 还回去
			*psta = NUL_STATE;   
			break;
		}
		break;
	case EOF :                       //  结束
		*psta = END_STATE;
		break;
	default:                       //  普通 字符    写到 pfOut流中 
		fputc(first,pfOut);
		*psta = NUL_STATE;
		break;
	}
}
void CConvert(FILE *pfIn, FILE *pfOut, enum STATE *psta)   
{
	int first = 0;
	int second = 0;
	int third = 0;
	first = fgetc(pfIn);
	switch (first)
	{
	case '*':            // 判断是否结束
		second = fgetc(pfIn);           // 获取结束的第二个字符  看是否结束
		switch (second)
		{
		case '/':		       //  表示c 模式 结束
			third = fgetc(pfIn);   // 获取第三个字符,用来判断连续注释以及换行问题
			if (third != '\n' && third != EOF)
				ungetc(third,pfIn);
			fputc('\n', pfOut);
			*psta = NUL_STATE;
			break;
		default:
			ungetc(second,pfIn);
			fputc(first,pfOut);
			*psta = C_STATE;
			break;
		}
		break;
	case '\n':           //   用来 解决多行注释
		fputc('\n',pfOut);
		fputc('/', pfOut);
		fputc('/', pfOut);
		*psta = C_STATE;
		break;
	default:
		fputc(first,pfOut);
		*psta = C_STATE;
		break;
	}
}

void CppCovert(FILE *pfIn, FILE *pfOut, enum STATE *psta)
{
	int first = 0;
	first = fgetc(pfIn);
	switch (first)
	{
	case '\n':
		fputc(first,pfOut);
		*psta = NUL_STATE;
		break;
	case EOF:
		*psta = END_STATE;
		break;
	default:
		fputc(first,pfOut);
		*psta = CPP_STATE;
		break;
	}
}

(3)test.c

 

#include"CommentConvert.h"

int main()
{
	CommentConvert();
	system("pause");
	return 0;
}


代码结果对比:







http://www.niftyadmin.cn/n/4136297.html

相关文章

linux上安装jdk和jmeter的脚本

2019独角兽企业重金招聘Python工程师标准>>> 前几天应工作的要求&#xff0c;搞起了jmeter压力测试&#xff0c;因为暂时没有多余的linux机器&#xff0c;所以下面的所有操作都是在我本地安装的虚拟机上完成的&#xff0c;不过&#xff0c;并无区别。 主要实现的操作…

ppt图片丢失_如何制作一个人物介绍ppt?

作为一名专业的PPT设计师&#xff01;分享点纯干货&#xff01;人物排版一定离不开3种类型&#xff0c;逃不出11种PPT版式&#xff01;直接套用做出高大上的人物介绍&#xff01;文末有福利。在很多类型的 PPT 中&#xff0c;比如像企业介绍、融资路演&#xff0c;产品宣讲等&a…

【Cocos2d-x 粒子系统】火球用手指飞起来

程序&#xff1a; 创建球 sp1 CCSprite::create("ball.png");sp1->setPosition(ccp(10, visibleSize.height/2));this->addChild(sp1);setTouchEnabled(true);让球飞起来吧&#xff0c;创建个简单粒子&#xff0c;点哪飞到哪 void HelloWorld::ccTouchEnded(C…

c++中class 中的this指针

1.this指针的经典描述&#xff1a; 当你进入一个房子后&#xff0c;    你可以看见桌子、椅子、地板等&#xff0c;    但是房子你是看不到全貌了。    对于一个类的实例来说&#xff0c;    你可以看到它的成员函数、成员变量&#xff0c;    但是实例本身呢&#…

HDU 3177 Crixalis#39;s Equipment(贪婪)

主题链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid3177 Problem DescriptionCrixalis - Sand King used to be a giant scorpion(蝎子) in the deserts of Kalimdor. Though hes a guardian of Lich King now, he keeps the living habit of a scorpion like li…

怎样用python打开文件_你真的会用python进行文件操作吗

本篇文章主要比较系统的介绍了python中文件操作&#xff0c;以及在在使用中需要注意的问题。 什么是文件 文件是系统存储区域的一个命名位置&#xff0c;用来存储一些信息&#xff0c;便于后续访问。能够在非易失性存储器中实现持续性存储&#xff0c;比如在硬盘上。当我们要读…

2017年全球创新公司琅琊榜及10条成功启示录

导读&#xff1a;每年年初&#xff0c;FastCompany都会公布他们评出的最有创新力的10个公司榜单&#xff0c;今年是这个榜单公布的第十年。 今年的榜单上&#xff0c;除了谷歌、亚马逊等大公司&#xff0c;也不乏一些从小的方向切入市场的公司让人印象深刻。此外&#xff0c;中…

总结c++类的构造函数 拷贝构造函数 析构函数 赋值运算符重载的特点以及函数调用顺序

对 c类的构造函数 拷贝构造函数 析构函数 赋值运算符重载 相关知识的总结&#xff0c;并附上例子&#xff0c;希望对大家有帮助&#xff0c;有错误大家可以指出来 一 构造函数 1 构造函数&#xff1a; 构造函数时一个特殊的成员函数&#xff0c;用来初始化对象的数据成员&am…