注释转换:由C语言的注释全部转换为C++的注释风格。
从input.c文件里读取的内容注释转换存储到output.c文件中。
状态图为:
通常采用switch case语句来处理。
input.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*/
代码为:
测试源文件 test.c
#include "commentconvert.h" int main() { int frist=0; FILE* pfout=NULL; FILE* pfin=NULL; enum STATE state=NUL_STATE; pfin=fopen(INPUT,"r"); if(pfin==NULL) { perror("out of read"); exit(EXIT_FAILURE); } pfout=fopen(OUTPUT,"w"); if(pfout==NULL) { perror("out of write"); fclose(pfin); exit(EXIT_FAILURE); } while(state!=END_STATE) { switch(state) { case NUL_STATE: { DONULSTATE(pfin,pfout,&state); } break; case C_STATE: { DOCSTATE(pfin,pfout,&state); } break; case CPP_STATE: { DOCPPSTATE(pfin,pfout,&state); } break; default: break; } } printf("转换成功\n"); system("pause"); return 0; } 头文件commentconvert.h
#ifndef _COMMENTCONVERT_H__ #define _COMMENTCONVERT_H__ #include <stdio.h> #include <stdlib.h> #define INPUT "input.c" #define OUTPUT "output.c" enum STATE { END_STATE, NUL_STATE, C_STATE, CPP_STATE }; void DONULSTATE(FILE* pfin,FILE* pfout,enum STATE* state); void DOCSTATE(FILE* pfin,FILE* pfout,enum STATE* state); void DOCPPSTATE(FILE* pfin,FILE* pfout,enum STATE* state); #endif //_COMMENTCONVERT_H__
源文件commentconvert.h
#include "commentconvert.h" void DONULSTATE(FILE* pfin,FILE* pfout,enum STATE* state) { int frist=0; int second=0; frist=fgetc(pfin); switch(frist) { case '/': { second=fgetc(pfin); switch(second) { case '*': { fputc('/',pfout); fputc('/',pfout); *state=C_STATE; } break; case '/': fputc(frist,pfout); fputc(second,pfout); *state=CPP_STATE; break; default: break; } } break; case EOF: *state=END_STATE; break; default: fputc(frist,pfout); break; } } void DOCSTATE(FILE* pfin,FILE* pfout,enum STATE* state) { int frist=0; int second=0; int thrid=0; frist=fgetc(pfin); switch(frist) { case '*': { second=fgetc(pfin); switch(second) { case '/': thrid=fgetc(pfin); switch(thrid) { case '\n': fputc(thrid,pfout); *state=NUL_STATE; break; case '/': fputc('\n',pfout); ungetc(thrid,pfin); *state=NUL_STATE; break; default: fputc('\n',pfout); ungetc(thrid,pfin); //撤销字符 *state=NUL_STATE; break; } break; default: fputc(frist,pfout); ungetc(second,pfin); break; } } break; case '\n': fputc(frist,pfout); fputc('/',pfout); fputc('/',pfout); break; default: fputc(frist,pfout); break; } } void DOCPPSTATE(FILE* pfin,FILE* pfout,enum STATE* state) { int frist=0; frist=fgetc(pfin); switch(frist) { case '\n': fputc(frist,pfout); *state=NUL_STATE; break; case EOF: *state=END_STATE; break; default: fputc(frist,pfout); break; } } 最后转换完成后output.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*/