注释转换(从c到c++)

来源:互联网 发布:adobe 2017mac百度云 编辑:程序博客网 时间:2024/05/14 22:32

要完成这个问题要考虑以下因素:

1. 换行问题

/* int i = 0; */int j = 0;/* int i = 0; */int j = 0;

2. /*与*/匹配问题

/*int i = 0;/*xxx*/ 


3. 多行注释问题

/*int i=0;int j = 0;int k = 0;*/int n = 0;

4. 连续注释问题

/**//**/

5. 连续**/问题

/*******/

以下为程序代码
1. 头文件
#ifndef __COMMENT_CONVERT_H_#define __COMMENT_CONVERT_H_#include <stdio.h>#include <stdlib.h>enum STATE// 设置状态{NUL_STATE,C_STATE,CPP_STATE,END_STATE};void DoConvert(FILE* pfIn, FILE* pfOut);//选择状态void DoNul_State(FILE* pfIn, FILE* pfOut);//无状态void DoC_State(FILE* pfIn, FILE* pfOut);//C状态void DoCpp_State(FILE* pfIn, FILE* pfOut);//CPP状态#endif
2. 源文件
#include "CommentConvert.h"enum STATE state = NUL_STATE;void DoConvert(FILE* pfIn, FILE* pfOut){while(state != END_STATE){switch(state){case NUL_STATE:DoNul_State(pfIn,pfOut);break;case C_STATE:DoC_State(pfIn,pfOut);break;case CPP_STATE:DoCpp_State(pfIn,pfOut);break;}}}void DoNul_State(FILE* pfIn, FILE* pfOut){int first = fgetc(pfIn);int second = 0;switch(first){case '/':second=fgetc(pfIn);switch(second){case '/':fputc(first, pfOut);fputc(second, pfOut);state = CPP_STATE;break;case '*':fputc(first, pfOut);fputc('/', pfOut);state =C_STATE;break;default:fputc(first, pfOut);fputc(second, pfOut);break;}break;case EOF:state = END_STATE;break;default:fputc(first, pfOut);break;}}void Check(FILE* pfIn, FILE* pfOut)//处理下一个字符并将指针返回当前位置{int check_n = fgetc(pfIn);if(check_n != '\n'){fputc('\n', pfOut);fseek(pfIn,-1,1);}elsefputc('\n', pfOut);}void DoC_State(FILE* pfIn, FILE* pfOut){int first = fgetc(pfIn);int second = 0;int third = 0;switch (first){case '\n':fputc('\n', pfOut);fputc('/', pfOut);fputc('/', pfOut);break;case '*':second = fgetc(pfIn);switch(second){third = fgetc(pfIn);case '/':{Check(pfIn,pfOut);state = NUL_STATE;}break;case '*':fputc(first, pfOut);while(1){third = fgetc(pfIn);if( '/' == third){Check(pfIn,pfOut);state = NUL_STATE;}break;if( '*' == third)fputc(second, pfOut);if( ( '/'!= third ) && ( '*' != third ) ){fputc(second, pfOut);fputc(third, pfOut);}third = fgetc(pfIn);}break;default:fputc(first, pfOut);fputc(second, pfOut);break;}break;default:fputc(first, pfOut);break;}}void DoCpp_State(FILE* pfIn, FILE* pfOut){int first = fgetc(pfIn);switch(first){case '\n':fputc(first, pfOut);state = NUL_STATE;break;case EOF:state = END_STATE;break;default :fputc(first, pfOut);break;}}

3.测试文件
#include "CommentConvert.h"void test(){FILE* pfIn = fopen("input.c","r");FILE* pfOut = NULL;if( NULL == pfIn){perror("open file for read");exit(EXIT_FAILURE);}pfOut = fopen("output.c","a");if( NULL == pfOut){perror("open file for w");fclose(pfIn);exit(EXIT_FAILURE);}DoConvert(pfIn,pfOut);fclose(pfIn);fclose(pfOut);}int main(){test();return 0;}



0 0