编写一个小项目将一个一个文件中的注释都转换成C++的注释风格
设计部分:
(1)头文件模块:包括模块中需要引用的头文件定义,需要实现的主要函数的声明
(2)头文件中主要函数模块的实现:各个函数部分实现的细节
(3)测试函数:检验函数模块的功能
(4)写入一个输入文件
(5)运行结果记入一个输出文件中
原始输入部分(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*/
//头文件模块 #ifndef __COMMENTCONVERT_H__ #define __COMMENTCONVERT_H__ #include <stdio.h> #include <stdlib.h> #define INPUT "input.c" #define OUTPUT "output.c" enum KIND //定义一个枚举常量来表示要执行的选项的操作 { END_START, NULL_START, C_START, Cpp_START, }; void CommentConvert(FILE *pfin, FILE *pfout); //注释转换操作函数 void DoNullState(FILE *pfin, FILE *pfout,enum KIND *sta); //普通字符转换函数 void DoCState(FILE *pfin, FILE *pfout,enum KIND *sta); //c语言注释转换为c++注释函数 void DoCppState(FILE *pfin, FILE *pfout,enum KIND *sta); //c++注释转换函数 #endif //__COMMENTCONVERT_H__
#define _CRT_SECURE_NO_WARNINGS 1 //函数具体功能实现模块实现 #include"CommentConvert.h" void DoNullState(FILE *pfin, FILE *pfout,enum KIND *sta) //普通字符转换函数 { int first=0; int second=0; first=fgetc(pfin); switch(first) { case '/': { fputc(first,pfout); second = fgetc(pfin); switch(second) { case '/': //如果是//将second输出,进入c++注释部分 fputc(second,pfout); *sta = Cpp_START; break; case '*': //如果是/*就将*改为/输出,进入c注释部分 fputc('/',pfout); *sta = C_START; break; default: fputc(second,pfout); break; } break; case EOF: //文件结束 fputc(first,pfout); *sta=END_START; break; default: //其他字符 fputc(first,pfout); break; } } } void DoCState(FILE *pfin, FILE *pfout,enum KIND *sta) //c语言注释转换为c++注释函数 { int first = 0; int second = 0; first=fgetc(pfin); switch(first) { case '/': fputc(first,pfout); break; case '*': { second=fgetc(pfin); switch(second) { case '*': fputc(first,pfout); ungetc(second,pfout); //将*之后的内容放到缓存区 break; case '/': { int third=fgetc(pfin); *sta=NULL_START; if(third == '\n') //判断注释之后是否需要主动换行的情况 { fputc('\n',pfout); } else { fputc('\n',pfout); ungetc(third,pfin); } } break; default: fputc(first,pfout); fputc(second,pfout); break; } } break; case '\n': second=fgetc(pfin); switch(second) { case '*': { int third=fgetc(pfin); if(third == '/') { fputc('\n',pfout); *sta = NULL_START; } else { fputc('/',pfout); fputc('/',pfout); fputc(second,pfout); fputc(third,pfout); } break; } default: fputc('\n',pfout); fputc('/',pfout); fputc('/',pfout); ungetc(second,pfin); break; } break; default: fputc(first,pfout); break; } } void DoCppState(FILE *pfin, FILE *pfout,enum KIND *sta) //c++注释转换函数 { int first = 0; first = fgetc(pfin); switch(first) { case '\n': fputc(first,pfout); *sta = NULL_START; break; default: fputc(first,pfout); break; } } void CommentConvert(FILE *pfin, FILE *pfout) //注释转换操作函数 { int input=0; int output=0; enum KIND str = NULL_START; while(str!=END_START) { switch(str) { case NULL_START: DoNullState(pfin, pfout, &str); break; case C_START: DoCState(pfin, pfout, &str); break; case Cpp_START: DoCppState(pfin, pfout, &str);//c++注释转换函数 break; case END_START: break; default: break; } } printf("转换成功!\n"); fclose(pfin); fclose(pfout); } #define _CRT_SECURE_NO_WARNINGS 1 //测试模块部分 #include <stdio.h> #include <stdlib.h> #include"CommentConvert.h" int main() { FILE *pfout = NULL; FILE *pfin = NULL; pfin = fopen(INPUT,"r"); //以读的形式打开文件 if(pfin == NULL) { perror("not open file"); exit(EXIT_FAILURE); } pfout=fopen(OUTPUT,"w"); //写入文件 if(pfout == NULL) { perror("not open file"); fclose(pfin); exit(EXIT_FAILURE); } CommentConvert(pfin,pfout); //注释转换操作函数 system("pause"); return 0; } //转换成功部分(outpu.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