注释转换 续
关于注释转换的问题 ,这里就不提了
。之前就已经
说明过是什么意思了
如果你你要是不知道 ,就点击这里 看看吧 注释转换
今天 要说的是将 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>
转自:http://blog.csdn.net/wx_east/article/details/52194778