注释转换(C注释转换为c++注释)

来源:互联网 发布:2017年中国m2数据 编辑:程序博客网 时间:2024/06/05 05:23

对于注释转换首先给出我的测试图:


由图可以看出将左边的c语言注释转换为右边c++注释就是注释转换


首先说明一下转换思想方法:

1.创建两个文件input.c和output.c,input.c里面用来读取c语言的注释,output.c里面保存转换成为c++的注释,中间的转换过程就是代码完成,当然文件名字和作用自己规定

2.转换的实际过程就是从存放c语言注释的文件中读取数据这里是一个字符一个字符读取,然后通过相关的函数将其转换为c++注释后的代码再写入保存c++注释的文件中

当然这里会用fgetc和fputc函数,其实这个项目就是练习文件的读写能力

在这里封装了三个函数:

1.void donulstate(FILE *pfin, FILE *pfout, enum STATE *s);//非C++,C状态的函数声明
这个是不存在注释的代码语句处理函数,即刚开始进入文件读写的函数

2.void docstate(FILE *pfin, FILE *pfout, enum STATE *s);//c状态进行操作
这个是发现是c语言注释的语句,则用这个函数将其改造为c++注释

3.void docppstate(FILE *pfin, FILE *pfout, enum STATE *s);//c++状态进行操作
这个是发现是c语言注释的语句,则用这个函数将其改造读写到保存c++注释额文件中

其核心的思想部分是这个样子,我用图来解释:


接下来给出具体的代码

首先给出commentconver.h头文件

#define _CRT_SECURE_NO_WARNINGS 1#ifndef __COMMENT_CONVER_H__#define __COMMENT_CONVER_H__#include<stdio.h>#include<stdlib.h>enum STATE{END_STATE,//结束NUL_STATE,//无状态C_STATE,//c注释函数CPP_STATE,//c++状态};void donulstate(FILE *pfin, FILE *pfout, enum STATE *s);//非C++,C,结束状态的函数声明void docstate(FILE *pfin, FILE *pfout, enum STATE *s);//c状态进行操作void docppstate(FILE *pfin, FILE *pfout, enum STATE *s);//c++状态进行操作#endif
接下来给出commentconver.c具体状态函数的实现代码

#define _CRT_SECURE_NO_WARNINGS 1#include"CommentConver.h"void donulstate(FILE *pfin, FILE *pfout, enum STATE *s)//开始无状态{int first =0;first = fgetc(pfin);switch (first){case '/'://第一个读取到'/'{int sceond = fgetc(pfin);switch (sceond){case '/'://第二个也读取‘/’,c++注释{*s = CPP_STATE;//状态转化到c++状态里面去fputc(first, pfout);fputc(sceond, pfout);}break;case '*'://第二个读取到*为c的注释{*s = C_STATE;//状态转换到c状态里面去fputc('/', pfout);fputc('/', pfout);}break;default://其他非注释情况直接读取{   fputc(first, pfout);   fputc(sceond, pfout);}break;}}break;case EOF://直接文件读取结束{*s = END_STATE;}break;default://刚开始未发现注释相关符号{   fputc(first, pfout);}break;}}void docstate(FILE *pfin, FILE *pfout, enum STATE *s)//C注释状态{int first = 0;first = fgetc(pfin);switch (first){    case '*'://结尾读取到*     {int sceond = 0;sceond = fgetc(pfin);switch (sceond){case '/'://一般情况:/* int i = 0; */{*s = NUL_STATE;//不需要操作}break;case '*'://连续注释问题如:/***/{fputc(first, pfout);ungetc(sceond, pfin);}break;default://其它非注释情况{   fputc(first, pfout);   fputc(sceond, pfout);}}    }break;case '\n'://多行注释问题{ fputc(first, pfout); fputc('/', pfout); fputc('/', pfout); }break;default://结尾直接是其他非注释情况{   fputc(first, pfout);}break;}}void docppstate(FILE *pfin, FILE *pfout, enum STATE *s)//c++注释状态{int first = 0;first = fgetc(pfin);switch (first){case '\n'://一般情况{ fputc(first, pfout); *s = NUL_STATE;}break;case EOF://文件读取结束{*s = END_STATE;}break;default://其他非注释情况fputc(first, pfout);break;}}
最后给出test.c

#define _CRT_SECURE_NO_WARNINGS 1#include"CommentConver.h"void commentconver(FILE *pfin, FILE *pfout){enum state state = NUL_STATE;//开始赋值为无状态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;}}}void test(){FILE *pfin = fopen("input.c", "r");//从文件里面读取东西if (pfin == NULL){perror("use open file read");exit(EXIT_FAILURE);}FILE *pfout = fopen("output.c", "w");//往文件里面写东西if (pfout == NULL){perror("use open file write");exit(EXIT_FAILURE);}//commentconver(pfin, pfout);//调用转换函数fclose(pfin);fclose(pfout);}int main(){test();system("pause");return 0;}
由于开头给出的图片就是我的测试结果所以这里就不放测试结果了

欢迎大家留言一起交流学习!




原创粉丝点击