注释转换

来源:互联网 发布:数据库系统设计 编辑:程序博客网 时间:2024/06/16 08:13

本函数就是见得实现一下C注释、CPP注释和普通模式之间的转换

(这只是在下的粗浅理解,不足的地方还请谅解,欢迎留言提出,后期理解深入后会加以改进)


1、先来了解一下这四种模式之间转换的条件


2、接下来就是完成的主要步骤了

我是将主函数与实现函数分不同的文件建立的

(1)、分别建立 mian.c   convert_comment.c  convert_comment.h三个新建项

在mian.c 中是主函数只需要调用在convert_comment.c 的函数就OK了

在convert_comment.h中就是函数的声明了


convert_comment.c中就是函数的定义了

这也是最主要的代码部分

(2)、接下来将详细的介绍代码部分

也就是三个函数的实现

普通模式


void do_null_status(FILE *ifp, FILE *ofp)         //普通模式{int c = fgetc(ifp);if (c == '/')                           //是 '/'时,进入判断 {int s = fgetc(ifp);if (s == '*')                  //下一发是'*'时{fputc('/', ofp);       fputc('/', ofp);        //将'/*'转换为'//'
status = CSTATUS;       //转换至C注释函数}else if (s == '/')             //下一个是'/'时{fputc('/', ofp);fputc('/', ofp);status = CPPSTATUS;       //转换至CPP注释函数}else{fputc(c, ofp);        ungetc(c, ifp);}}else if (c == EOF)                       //为EOF时,文件结束status = EOFSTATUS;else fputc(c, ofp);}

C注释


void do_c_status(FILE *ifp, FILE *ofp)           //C注释{int c = fgetc(ifp);if (c == '*')                         //为'*'时进入判断{int s = fgetc(ifp);if (s == '/')                //为'/'时,说明C注释结束{fputc('\n', ofp);status = NULLSTATUS;    //转入普通模式}else{fputc(c, ofp);ungetc(c, ifp);status = CSTATUS;}}else if (c == EOF)status = EOFSTATUS;else if (c == '\n')                //因为C注释是多行注释,所以遇到'\n’时,还是C注释,{                                  //需要给下一行添加'//'fputc(c, ofp);fputc('/', ofp);fputc('/', ofp);status = CSTATUS;}else{fputc(c, ofp);status = CSTATUS;}}

CPP注释


void do_cpp_status(FILE *ifp, FILE *ofp)          //CPP注释{int c = fgetc(ifp);if (c == '\n')                            //若为'\n'则CPP注释结束{fputc(c, ofp);status = NULLSTATUS;              //转为普通模式}else if (c == EOF)                       //为EOF则文件结束{fputc(c, ofp);status = EOFSTATUS;}else{fputc(c, ofp);status = CPPSTATUS;}}
以上就是我的理解

下面是整体代码

mian.c

#include<stdio.h>#include"convert_comment.h"int main(){convert_main();return 0;}
convert_comment.h

#ifndef __CONVERT_COMMENT_H__#define __CONVERT_COMMENT_H__#define INPUTFILE "input.c"#define OUTPUTFILE "output.c"enum {NULLSTATUS,     // 普通模式CSTATUS,        // C模式CPPSTATUS,      //CPP模式EOFSTATUS,      //EOF模式};void convert_main();void do_null_status(FILE *ifp, FILE *ofp); //普通模式函数声明void do_c_status(FILE *ifp, FILE *ofp);    //C注释函数声明void do_cpp_status(FILE *ifp, FILE *ofp);  //CPP注释函数声明#endif
convert_comment.c

#include <stdio.h>#include <stdlib.h>#include "convert_comment.h"int status = NULLSTATUS;void do_null_status(FILE *ifp, FILE *ofp)         //普通模式{int c = fgetc(ifp);if (c == '/'){int s = fgetc(ifp);if (s == '*'){fputc('/', ofp);fputc('/', ofp);status = CSTATUS;}else if (s == '/'){fputc('/', ofp);fputc('/', ofp);status = CPPSTATUS;}else{fputc(c, ofp);ungetc(c, ifp);}}else if (c == EOF)status = EOFSTATUS;else fputc(c, ofp);}void do_c_status(FILE *ifp, FILE *ofp)           //C注释{int c = fgetc(ifp);if (c == '*'){int s = fgetc(ifp);if (s == '/'){fputc('\n', ofp);status = NULLSTATUS;}else{fputc(c, ofp);ungetc(c, ifp);status = CSTATUS;}}else if (c == EOF)status = EOFSTATUS;else if (c == '\n'){fputc(c, ofp);fputc('/', ofp);fputc('/', ofp);status = CSTATUS;}else{fputc(c, ofp);status = CSTATUS;}}void do_cpp_status(FILE *ifp, FILE *ofp)          //CPP注释{int c = fgetc(ifp);if (c == '\n'){fputc(c, ofp);status = NULLSTATUS;}else if (c == EOF){fputc(c, ofp);status = EOFSTATUS;}else{fputc(c, ofp);status = CPPSTATUS;}}void convert_work(FILE *ifp, FILE *ofp){while (status != EOFSTATUS){switch (status){case NULLSTATUS:do_null_status(ifp, ofp);break;case CSTATUS:do_c_status(ifp, ofp);break;case CPPSTATUS:do_cpp_status(ifp, ofp);break;case EOFSTATUS:break;default:break;}}}void convert_main(){    FILE *ifp = fopen(INPUTFILE, "r");FILE *ofp = fopen(OUTPUTFILE, "w");if (ifp == NULL || ofp == NULL){printf("This is no have!");return;}convert_work(ifp, ofp);fclose(ifp);fclose(ofp);}


运行结果图





原创粉丝点击