注释转换(C->C++)

注释转换
一、定义:注释转换 就是将代码中的注释转换为同一类 ,比如是 C 语言 或者C++ .
                  C语言中,编译器默认的注释风格是    /*  .........*/   
                  C++中,编译器默认的注释风格是  // ....... (注释一行)
二、注释转换关系如下图:
  

三、注释转换代码如下:

--------------------------------------------------头文件.h------------------------------------------------------------------

#pragma once
#ifndef __COMMENT_CONVERT_H__
#define __COMMENT_CONVERT_H__

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


enum State
{
	NUL_STATE,
	C_STATE,
	CPP_STATE,
	END_STATE
};
// pfin表示的是要读取的文件 ,pfout表示转换后输出的文件 
void DoCommentConvert(FILE*pfIn, FILE*pfOut);//执行转换函数 
void DoNulState(FILE*pfIn, FILE*pfOut, enum State* ps);//无状态转换	
void DoCState(FILE*pfIn, FILE*pfOut, enum State* ps);//C状态转换	
void DoCppState(FILE*pfIn, FILE*pfOut, enum State* ps);//CPP状态转换

#endif //__COMMENT_CONVERT_H__

------------------------------------------------源文件.c----------------------------------------------------------------------

#define  _CRT_SECURE_NO_WARNINGS   
#include "DoCommentConvert.h"  
void DoCommentConvert(FILE*pfIn, FILE*pfOut)
{
	enum State state = NUL_STATE;//初始状态为未知状态
	while (state != END_STATE)//代码为结束状态时跳出循环
	{
		switch (state)
		{
		case NUL_STATE://未知状态
			DoNulState(pfIn, pfOut, &state);
			break;
		case C_STATE://C状态
			DoCState(pfIn, pfOut, &state);
			break;
		case CPP_STATE://C++状态
			DoCppState(pfIn, pfOut, &state);
			break;
		default:
			break;
		}
	}
}
void DoNulState(FILE*pfIn, FILE*pfOut, enum State* ps)//无状态转换	
{
	int first = 0;
	int second = 0;
	first = fgetc(pfIn);//从文件中读取一个字符来判断
	switch (first)
	{
	case '/':
	{
		second = fgetc(pfIn);//再读取一个字符
		switch (second)
		{
		case '*'://   “/*”表示进入C状态
		{
			fputc('/', pfOut);
			fputc('/', pfOut);
			//将注释转换为C++并输出到文件
			*ps = C_STATE;//未知状态转化为C状态
		}
		case '/'://    “//”表示进入C++状态
		{
			fputc(first, pfOut);
			fputc(second, pfOut);
			*ps = CPP_STATE;//将未知状态转化为C++状态
		}
			break;
		default://表示这个'/'是字符
		{
			fputc(first, pfOut);//将读取到的字符输出到文件
			fputc(second, pfOut);
		}
			break;
		}
	}
		break;
	case EOF://代码结束
	{
		fputc(first, pfOut);//将EOF输出到文件
		*ps = END_STATE;//状态改为结束状态
	}
		break;
	default:                     //状态不变,正常输出
	{
		fputc(first, pfOut);//将读取的字符输出到文件
	}
	break;
	}
}
void DoCState(FILE*pfIn, FILE*pfOut, enum State* ps)//C状态转换	
{
	int first = 0;
	int second = 0;
	int third = 0;
	first = fgetc(pfIn);//从文件中读取一个字符来判断
	switch (first)
	{
	case '*':
		second = fgetc(pfIn);//再读取一个字符
		switch (second)
		{
		case '/'://  “*/”表示C注释结束  但要判断之后是不是'\n',因为C++注释是以换行结束的
		{
			third = fgetc(pfIn);
			if (third == '\n')
			{
				fputc(third, pfOut);
			}
			else  
			{
				fputc('\n', pfOut);//如果之后不是'\n', 需要帮它换行
				ungetc(third, pfIn);//并且要将用来判断的字符从读取流中的撤销,防止下次判断时  少判断一个字符  
			}
			*ps = NUL_STATE;//状态转换为未知状态
		}
			break;
		default:
		{
			fputc(first, pfOut);
			ungetc(second, pfIn);//将多余用来判断的字符撤销
		}
			break;
		}

		break;
	case '\n'://换行之后要加上 // 因为C++只注释能一行  
	{
		fputc(first, pfOut);
		fputc('/', pfOut);
		fputc('/', pfOut);
	}
	default:
	{
		fputc(first, pfOut);//将读取的字符输出到文件
	}
		break;
	}
}
void DoCppState(FILE*pfIn, FILE*pfOut, enum State* ps)//CPP状态转换
{
	int first = 0;
	int second = 0;
	int third = 0;
	first = fgetc(pfIn);
	switch (first)
	{
	case '\n':// 表示C++一行注释结束
	{
		fputc(first, pfOut);
		*ps = NUL_STATE;
	}
	break;
	default:
	{
		fputc(first, pfOut);
	}
		break;
	}
}

-------------------------------------------------测试代码test.c----------------------------------------------------------------


#define  _CRT_SECURE_NO_WARNINGS   
#include"DoCommentConvert.h"
int main()
{
	FILE *pfIn = NULL;//定义两文件指针
	FILE *pfOut = NULL;
	pfIn = fopen("input.c", "r");//打开读取的文件
	if(pfIn == NULL)
	{
		perror("open file for input:");
		exit(EXIT_FAILURE);//读取失败
	}
	pfOut = fopen("outpur.c", "w");//打开写入的文件
	if (pfOut == NULL)
	{
		perror("open file for output");
		exit(EXIT_FAILURE);//读取失败
	}
	DoCommentConvert(pfIn,pfOut);//注释转换
	printf("转换成功\n");
	fclose(pfIn);
	fclose(pfOut);
	system("pause");
	return 0;
}

 
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
给下面代码每一行给上注释并说明这段代码的意思#include "pch.h" #include "FinBudgetSupport.h" #include <map> time_t StringToDateTime(char* str) { tm tm_; int year, month, day, hour, min, sec; afxDump << str << "\n\n\n\n"; sscanf_s(str, "%d-%d-%d %d:%d:%d", &year, &month, &day, &hour, &min, &sec); tm_.tm_year = year - 1900; tm_.tm_mon = month - 1; tm_.tm_mday = day; tm_.tm_hour = hour; tm_.tm_min = min; tm_.tm_sec = sec; tm_.tm_isdst = -1; time_t t_ = mktime(&tm_); return t_; } CString DateTimeToString(time_t _time) { tm *_tm = new tm(); gmtime_s(_tm ,&_time); CString t_str; t_str.Format(_T("%d-%d-%d %d:%d:%d"), _tm->tm_year+1900, 1+_tm->tm_mon, _tm->tm_mday, _tm->tm_hour , _tm->tm_min, _tm->tm_sec); delete _tm; return t_str; } CString _toCString(double _value) { CString t_str; t_str.Format(_T("%lf"), _value); return t_str; } CString _toCString(int _value) { CString t_str; t_str.Format(_T("%d"), _value); return t_str; } double _toDouble(CString _str) { return _ttof(_str); } char* CStringToCharArray(CString str) { int str_len = WideCharToMultiByte(CP_ACP, 0, str, str.GetLength(), NULL, 0, NULL, NULL);//计算字节数 char* CharArray = new char[str_len + 1]; WideCharToMultiByte(CP_ACP, 0, str, str.GetLength(), CharArray, str_len, NULL, NULL); CharArray[str_len] = '\0'; return CharArray; } void SplitString(const std::string& s, std::vector<std::string>& v, const std::string& c) { std::string::size_type pos1, pos2; pos2 = s.find(c); pos1 = 0; while (std::string::npos != pos2) { v.push_back(s.substr(pos1, pos2 - pos1)); pos1 = pos2 + c.size(); pos2 = s.find(c, pos1); } if (pos1 != s.length()) v.push_back(s.substr(pos1)); }
06-10

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值