注释转换

来源:互联网 发布:java 对比相似度 编辑:程序博客网 时间:2024/05/30 04:11

注释转换:

题目描述:

给定一段代码,其中有c语言的注释风格,也有c++的注释风格,要求将c语言的注释风格转换为c++的注释风格,属于c++注释风格的不转换,剩余其他原样输出。

题目分析如下图:


                              

需要的函数:首先我们需要3种状态和一个切换状态的函数,

1.空状态void Do_NUL_State(),即既不属于c状态也不属于c++状态

2.c状态void Do_C_State(),需要将/*x*/,转换为//x;;

3.c++状态,即属于c++注释风格的不变

void Do_CPP_State();

4;切换函数void ConmentConvert(),用于切换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;
// 5.连续注释问题
/**//**/


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


// 7.C++注释问题
// /*xxxxxxxxxxxx*/

头文件部分:

#define _CRT_SECURE_NO_WARNINGS 1#ifndef __CONMENTCONVERT_H#define __CONMENTCONVERT_H#include<stdio.h>#include<stdlib.h>#include<string.h> #define INPUTFILENAME "input.c"#define OUTPUTFILENAME "output.c"enum STATE{NUL_STATE,C_STATE,CPP_STATE,END_STATE};void ConmentConvert(FILE *pfRead,FILE *pfWrite);void Do_NUL_State(FILE *pfRead,FILE *pfWrite);void Do_C_State(FILE *pfRead,FILE *pfWrite);void Do_CPP_State(FILE *pfRead,FILE *pfWrite);#endif
主函数部分:
<span style="color:#6600cc;">#include"ConmentConvert.h"  int main()  {      FILE *pfread=NULL;      FILE *pfwrite=NULL;      printf("转化开始\n");      pfread=fopen(INPUTFILENAME,"r");      if(NULL == pfread)      {          perror("open file for read\n");          exit(EXIT_FAILURE);      }      pfwrite=fopen(OUTPUTFILENAME,"w");      if(NULL == pfwrite)      {          fclose(pfread);          perror("open file for write\n");          exit(EXIT_FAILURE);      }      ConmentConvert(pfread,pfwrite);      printf("转化结束\n");  system("pause");return 0;}  </span>
函数实现部分:

<pre name="code" class="cpp"><span style="font-size:18px;color:#ff0000;"><strong>#define _CRT_SECURE_NO_WARNINGS 1#include"conmentconvert.h"enum STATE state=NUL_STATE;int frist=0;int second=0;int third=0;void Do_NUL_State(FILE *pfRead,FILE *pfWrite){frist=fgetc(pfRead);switch(frist){case '/':second=fgetc(pfRead);if(second=='*'){fputc('/',pfWrite);fputc('/',pfWrite);state=C_STATE;}else if(second=='/'){fputc(frist,pfWrite);fputc(second,pfWrite);state=CPP_STATE;}else//其他字符直接输出{fputc(frist,pfWrite);fputc(second,pfWrite);}break;case EOF://文件结束标志     state=END_STATE; break;default:fputc(frist,pfWrite);//处理不是注释的字符break;}}void Do_C_State(FILE *pfRead,FILE *pfWrite){frist=fgetc(pfRead);switch(frist){case '*':second=fgetc(pfRead);          switch(second)          {          case '*':                  //   6.连续的/***/问题              third=fgetc(pfRead);              fputc(frist,pfWrite);              if(third == '/')                  {                  state=NUL_STATE;            }              break;          case '/':              third=fgetc(pfRead);             if(third == '/')       //5.连续的注释问题/**//**/              {                  ungetc('/',pfRead);                  state=NUL_STATE;                  break;     }   else   {            fputc(third,pfWrite);   //   /* int i = 0; */ \n int j = 0;              state=NUL_STATE;               break;    }        default:                   //不是注释的字符              fputc(frist,pfWrite);              fputc(second,pfWrite);              break;          }          break;      case '\n':    fputc('\n',pfWrite);          //4.C注释中的多行注释           fputc('/',pfWrite);          fputc('/',pfWrite);        break;  case EOF:state=END_STATE;break;default:fputc(frist,pfWrite);break;}}void Do_CPP_State(FILE *pfRead,FILE *pfWrite){frist=fgetc(pfRead);switch(frist){case '\n':fputc(frist,pfWrite);state=NUL_STATE;break;case EOF:state=END_STATE;          break;  default:fputc(frist,pfWrite);  break;}}void ConmentConvert(FILE *pfRead,FILE *pfWrite){while(state != END_STATE){switch(state){case NUL_STATE:Do_NUL_State(pfRead,pfWrite);break;case C_STATE:Do_C_State(pfRead,pfWrite);break;case CPP_STATE:Do_CPP_State(pfRead,pfWrite);break;case END_STATE:break;default:break;}}}</strong></span>





1 0