注释转换 续 (C++注释转换为C注释)

来源:互联网 发布:传奇霸业轮回魔道数据 编辑:程序博客网 时间:2024/05/17 11:35

注释转换 续

关于注释转换的问题  ,这里就不提了。之前就已经  说明过是什么意思了 
如果你你要是不知道  ,就点击这里   看看吧   注释转换


今天  要说的是将  C++注释转换为C语言注释  ,大家都知道  C++注释的风格 是  //.......注释一行 ,然后以\n作为
结束标志的,所以要将注释转换 , 也同样要考虑多种 用问题 ,

下面是我写的一些实例  
/* 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;

代码实现  

~~~~~~~~~~头文件 .h~~~~~~~~~~~~

#pragma once #include<stdio.h>#include<stdlib.h>enum STATE //定义一个枚举类型  表示   此时代码的状态{NUL,//无注释状态 C,//C语言注释状态CPP,//C++注释状态END//代码结束状态};//执行转换函数void CommentConvert(FILE *pfin,FILE * pfout);//pfin 表示的是要读取的文件 ,pfout表示转换后输出的文件//无状态转换void DoNULConvert(FILE *pfin,FILE * pfout,enum STATE * state);//c状态转换void DoCConvert(FILE *pfin,FILE * pfout,enum STATE * state);//c++状态转换void DoCPPConvert(FILE *pfin,FILE * pfout,enum STATE * state);


~~~~~~~~~~~源文件.c~~~~~~~~~~~
#define  _CRT_SECURE_NO_WARNINGS #include "CommentConvert.h"void CommentConvert(FILE *pfin,FILE * pfout){enum STATE state = NUL;//初始化状态 为   无注释状态while(state != END)//代码结束时跳出循环{switch(state){case NUL://状态为无注释状态{DoNULConvert(pfin,pfout,&state);}break;case C://状态为C注释状态{DoCConvert(pfin,pfout,&state);}break;case CPP://状态为C++注释状态{DoCPPConvert(pfin,pfout,&state);}break;default:break;}}}//无状态转换void DoNULConvert(FILE *pfin,FILE * pfout,enum STATE * state){int start = 0;int next = 0;start = fgetc(pfin);//从文件中读取一个字符 来判断switch( start){case '/'://表示要进入注释状态 {next = fgetc(pfin);//再从文件中读取一个字符  判断switch(next){case '*'://表示代码是 /*  表示进入C语言注释状态{fputc(start,pfout);//将注释输出到文件fputc(next,pfout);*state = C;//状态转换为  C注释状态}break;case '/'://表示代码是 //  表示进入C++注释状态{fputc('/',pfout);//j将它改为C注释 输出到文件fputc('*',pfout);*state  = CPP;  //状态转换为  C++注释状态}break;default:   //表示这个'/ '是字符 {fputc(start,pfout); //将读取到的字符输出到文件ungetc(next,pfin);}break;}}break;case EOF://遇到EOF表示代码结束{fputc(start,pfout);//将EOF输到文件*state = END;//状态改为 END}break;default://表示遇到的不是注释  ,状态不变 {fputc(start,pfout);//将读取的字符输出到文件}break ;}}//c++状态转换void DoCPPConvert(FILE *pfin,FILE * pfout,enum STATE * state){int start = 0;int next = 0;int then = 0;start = fgetc(pfin);//从文件中读取一个字符 来判断switch(start){case '\n' ://表示 C++一行注释结束 {next = fgetc(pfin);switch(next)//判断 下行 是不是也是注释{case '/':{then =  fgetc(pfin);if(then =='*'){fputc('*',pfout);fputc('/',pfout);fputc(start,pfout);fputc(next,pfout);fputc(then,pfout);*state = C;}else if(then =='/'){fputc(start,pfout);}}break;case EOF:fputc('*',pfout);fputc('/',pfout);fputc(start,pfout);fputc(next,pfout);*state = END;break;default:fputc('*',pfout);fputc('/',pfout);fputc(start,pfout);fputc(next,pfout);*state = NUL;break;}}break;case '*':{next = fgetc(pfin);if(next == '/'){;}else{ungetc(next,pfin);fputc(start,pfout);}}break;default:fputc(start,pfout);break;}}//c状态转换void DoCConvert(FILE *pfin,FILE * pfout,enum STATE * state){int start = 0;int next = 0;int then = 0;start = fgetc(pfin);//从文件中读取一个字符 来判断switch(start)//c注释状态  不会直接转换为END状态{case '*'://遇到'*'表示C语言注释状态  可能会结束{next = fgetc(pfin); //再重新 读取 一个字符 switch(next)//判断{case '/'://表示  C语言注释  结束  {fputc(start,pfout);fputc(next,pfout);*state = NUL;//状态装换为无注释状态}break;default :{fputc(start,pfout);ungetc(next,pfin);//将多余用来判断的字符撤销 }break;    }}break;default:fputc(start,pfout); //否则直接输出break;}}

~~~~~~~~~~~测试代码 .c~~~~~~~~~~~~

#define  _CRT_SECURE_NO_WARNINGS #include "CommentConvert.h"int main(){FILE *pfin = NULL;//定义两文件指针FILE *pfout= NULL;pfin = fopen("input.c","r");//打开 读取 的文件 if(pfin == NULL){perror("input file open:");//读取失败exit(EXIT_FAILURE);}pfout = fopen("output.c","w");//打开 要写入 的文件 if(pfout ==NULL){perror("output file open:");//读取失败fclose(pfin);//要将读文件关闭取的exit(EXIT_FAILURE);}CommentConvert(pfin,pfout);printf("转换成功\n");fclose(pfin);//关闭两文件fclose(pfout);system("pause");return  0;}<strong></strong>








2 0