小项目之注释转换

一.将所有注释风格全部转换成C++风格

想法:既然要转换风格,第一步搞清楚注释有几种方式:

          第一种无注释,第二种C注释,第三种C++注释。

         可以把这三种方式看成一种状态-status

        第二步:C注释分几种情况:末尾结束,注释中又有C注释或者C++注释

                     C++注释同样考虑清楚。

先写测试文件:

/*int w =2;*/ int j = 0;
int i =9;

//eioshr;
/*ejre***/                //最好先考虑清楚再动手写,不然会修改很多次
int s = 3;
/*int n =9;
re =9;
int e =3;*/
int a = 0;

再写头文件:

#ifndef _COMMENT_CONVERT_H_         //条件编译,防止头文件被重复引用
#define _COMMENT_CONVERT_H_
 
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
enum State
{                           //用枚举来标识状态,优点:防止命名污染,便于调试,维护,可以定义多个变量
	NUL_STATE,           // 缺点:只能是整型常量,不能是浮点型
	C_STATE,
	CPP_STATE,
	END_STATE
};
void DoNulState(FILE *pfIn,FILE *pfOut,enum State *ps);
void DoCstateState(FILE *pfIn,FILE *pfOut,enum State *ps);
void DoCppState(FILE *pfIn,FILE *pfOut,enum State *ps);

void CommentConver(FILE *pfin,FILE *pfout);
#endif //_COMMENT_CONVERT_H_       //结束,最好注释一下

    再写运行文件:

    

#include"CommentCovert.h"

int main()
{
  FILE *pfin = NULL;
  FILE *pfout = NULL;

   pfin =fopen("input.c","r");         //打开一个文件,用R来读
   if(pfin == NULL)
   {
	   perror("Error opening file");     //perror 错误信息返回
	   exit(EXIT_FAILURE);               //退出
   }
   pfout = fopen("pfout.c","w");       //写
   if(pfout == NULL)
   {
	   fclose(pfin);
	   pfin = NULL;
	   perror("Eorror opening file");
	   exit(EXIT_FAILURE);
   }

 CommentConver(pfin,pfout);
   
   fclose(pfin);
   pfin = NULL;
   fclose(pfout);
   pfout = NULL;

   return 0;
}

接着写函数接口文件:

#include"CommentCovert.h"

void CommentConver(FILE *pfin,FILE *pfout)
{
	enum State status = NUL_STATE;       //默认状态值是无注释

	while(status != END_STATE)      
	{
		switch(status)
		{
		case NUL_STATE:
			DoNulState(pfin,pfout,&status);
			break;
		case C_STATE:
			DoCstateState(pfin,pfout,&status);  //c注释
			break;
		case CPP_STATE:
			DoCppState(pfin,pfout,&status);   //c++注释
			break;
		
		}
	}
}
void DoNulState(FILE *pfIn,FILE *pfOut,enum State *ps)
{
     int first = fgetc(pfIn);
	 switch(first)
	 {
	 case '/':
		 {
			 int second = fgetc(pfIn);
			 switch(second)
			 {
			 case '/':
				 {
					 fputc('/',pfOut);
					 fputc('/',pfOut);
					 *ps = CPP_STATE;
				 }
				 break;
			 case '*':
				 {
					 fputc('/',pfOut);
					 fputc('/',pfOut);
					 *ps = C_STATE;
				 }
				 break;
			 case EOF:
				 *ps = END_STATE;
				 break;
			 default:
				 {
				 fputc(first,pfOut);
				 fputc(second,pfOut);
				 }
				 break;
			 }
		 }
		 break;
	 case EOF:
		 *ps = END_STATE;
		 break;
	 default:
		 {
			 fputc(first,pfOut);
			 break;
		 }
	 }

}
void DoCstateState(FILE *pfIn,FILE *pfOut,enum State *ps)
{
	int first = fgetc(pfIn);
	switch(first)
	{
     case '*':
		 {
          int  second= fgetc(pfIn);
		  switch(second)
		  {
		  case '/':
			  {   
				  int third = fgetc(pfIn);
				  fputc('\n',pfOut);
				  *ps = NUL_STATE;
			  }
		          break;		
		 default :
			  {
				  int four = 0;
				  ungetc(second,pfIn);   //把读出的那个字符返回去
				  fputc(first,pfOut);
			  }
			  break;
		   }
		 }
		 break;
	  case '\n':
		  {
		     ;
		  }
             break;
	  default:
		  fputc(first,pfOut);
		  break;
	  }
}

void DoCppState(FILE *pfIn,FILE *pfOut,enum State *ps)
{
	  int  first = fgetc(pfIn);
	 
	  switch(first)
	  {
	  case '\n':
		  {
		  fputc(first,pfOut);
		  *ps = NUL_STATE;
		  }
		  break;
	  case EOF:
		  *ps = END_STATE;
	  default:
		  fputc(first,pfOut);
		  break;
	  }
	
}

最后看结果是不是转换成功

//int w =2;
int j = 0;
int i =9;

//eioshr;
//ejre**
int s = 3;
//int n =9;re =9;int e =3;
int a = 0;

猜你喜欢

转载自blog.csdn.net/congjichukaishi/article/details/80712229
今日推荐