注释转换:将C语言中的注释风格/*...*/转换为C++的注释风格//.
转换方法先分析如下图:
由图可以看出,将注释转换过程分为四种状态,NULL_STATE(无注释状态)、C_STATE(C语言注释状态)、CPP_STATE(C++注释状态)、END_STATE(文件结束状态),通过四种状态的相互切换实现注释的转换,具体实现过程为:用文件的方式中函数fopen打开源文件input.c,并进行读操作,打开output.c文件,进行注释转换后的写操作,转换过程中调用函数CommentConvert(pfIn,pfOut)转换,先在NULL_STATE状态下用函数fgetc函数读取第一个字符,若为'/',再读取第二个字符,若为'*'则切换到C_STATE状态实现,若第二个字符为'/',则切换到CPP_STATE状态实现,如此一直相互切换,并在各自状态具体代码实现下用fputc函数输出转换为C++注释和各个原字符,直至遇到EOF,状态切换为end_state.
而在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; */int k = 0; // 5.连续注释问题 /**//**/ // 6.连续的**/问题 /************/ // 7.C++注释问题 // /*xxxxxxxxxxxx*/根据这些情况,在此项目中我们则将这作为input.c文件对其进行转换,具体代码实现过程如下:
分别定义三个文件:
头文件CommentConvert.h
#ifndef __CommentConvert_H__ #define __CommentConvert_H__ #include <stdio.h> #include <stdlib.h> enum STATE { NUL_STATE, C_STATE, CPP_STATE, END_STATE, }; void CommentConvert(FILE *pfIn,FILE *pfOut); void Do_NUL_STATE(FILE *pfIn,FILE *pfOut,enum STATE *state); void Do_C_STATE(FILE *pfIn,FILE *pfOut,enum STATE *state); void Do_CPP_STATE(FILE *pfIn,FILE *pfOut,enum STATE *state); #endif __CommentConvert_H__
#include "CommentConvert.h" void CommentConvert(FILE *pfIn,FILE *pfOut) { void DoConverWork(FILE *pfIn,FILE *pfOut); DoConverWork(pfIn,pfOut); } void DoConverWork(FILE *pfIn,FILE *pfOut) { enum STATE state=NUL_STATE; while(state!=END_STATE) { switch(state) { case NUL_STATE: Do_NUL_STATE(pfIn,pfOut,&state); break; case C_STATE: Do_C_STATE(pfIn,pfOut,&state); break; case CPP_STATE: Do_CPP_STATE(pfIn,pfOut,&state); break; default: break; } } } void Do_NUL_STATE(FILE *pfIn,FILE *pfOut,enum STATE *state) { int first=0; int second=0; first=fgetc(pfIn); switch(first) { case '/': { second=fgetc(pfIn); switch(second) { case '*': { fputc('/',pfOut); fputc('/',pfOut); *state=C_STATE; } break; case '/': { fputc(first,pfOut); fputc(second,pfOut); *state=CPP_STATE; } break; default: { fputc(first,pfOut); fputc(second,pfOut); } break; } } break; case EOF: *state=END_STATE; break; default: fputc(first,pfOut); break; } } void Do_C_STATE(FILE *pfIn,FILE *pfOut,enum STATE *state) { int first=0; int second=0; int third=0; first=fgetc(pfIn); switch(first) { case '*': { second=fgetc(pfIn); switch(second) { case '/': { third=fgetc(pfIn); if(third!='\n') { fputc('\n',pfOut); } if(third=='/') { ungetc(third,pfIn); *state=NUL_STATE; break; } fputc(third,pfOut); *state=NUL_STATE; } break; case '*': { fputc(first,pfOut); third=fgetc(pfIn); if(third=='/') { *state=NUL_STATE; break; } fputc(second,pfOut); ungetc(third,pfIn); } break; default: { fputc(first,pfOut); fputc(second,pfOut); } break; } } break; case '\n': { fputc(first,pfOut); fputc('/',pfOut); fputc('/',pfOut); } break; case EOF: *state=END_STATE; break; default: fputc(first,pfOut); break; } } void Do_CPP_STATE(FILE *pfIn,FILE *pfOut,enum STATE *state) { int first=0; 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; } }
#include "CommentConvert.h" int main() { FILE *pfIn=NULL; FILE *pfOut=NULL; pfIn=fopen("input.c","r"); if(pfIn==NULL) { perror("error input.c"); exit(EXIT_FAILURE); } pfOut=fopen("output.c","w"); if(pfOut==NULL) { perror("error output.c"); fclose(pfIn); exit(EXIT_FAILURE); } CommentConvert(pfIn,pfOut); printf("****转换成功****\n"); fclose(pfIn); fclose(pfOut); system("pause"); return 0; }
// 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; // 5.连续注释问题 // // // 6.连续的**/问题 //********** // 7.C++注释问题 // /*xxxxxxxxxxxx*/