注释转换<C注释-->C++注释>

来源:互联网 发布:贪吃蛇java课程设计 编辑:程序博客网 时间:2024/05/20 20:20

# 本篇博客为简单的注释转换实现,功能为将简单的C注释段落转换为CPP注释



@ 注意: 代码中所用到的fopen,fwrite,fread等文件操作函数在通讯录文件流博客中做了介

绍:http://blog.csdn.net/bitboss/article/details/51438742

@ ungetc 函数是将从文件中读取的一个字符还回到缓冲区,即文件中去;

@ 分析思路图

@分析思路图



# 自定义头文件部分


#ifndef __COMMENT_CONVERT_H__#define __COMMENT_CONVERT_H__#include<stdio.h>#include<stdlib.h>#define INPUTFILENAME "input.c"#define OUTPUTFILENAME "output.c"typedef enum CONVERT_START//枚举表示操作选项;{NULL_START,C_START,CPP_START,END_START}StateType;void CommentConvert();void ConvertWork(FILE *read,FILE *write);//注释转换操作选项函数;void DoCState(FILE *read,FILE *write);//C 转换为 cpp函数;void DoNullState(FILE *read,FILE *write);//普通语句空转换函数;void DoCppState(FILE *read,FILE *write);//cpp 转换 C 函数;#endif //__COMMENT_CONVERT_H__

# 函数功能实现部分:

#define _CRT_SECURE_NO_WARNINGS 1#include"CommentConvert.h"StateType state;void DoNullState(FILE *read,FILE *write)//无转换操作函数;{int first = fgetc(read);int second;switch(first){case'/':second = fgetc(read);if(second == '*'){fputc(first,write);fputc('/',write);state = C_START ;//如果是C注释我们将状态改为C状态,并且将注释开头改为Cpp注释;}else if(second == '/'){fputc(first,write);fputc(second,write);state = CPP_START ; //如果是Cpp注释我们将状态改为Cpp状态;}else //普通语句就直接写入;{fputc(first,write);fputc(second,write);} break;case EOF:    fputc(first,write);state = END_START ;//注释结束,状态调整;break;default://开始就为普通内容,直接写入;fputc(first,write);break;}}void DoCState(FILE *read,FILE *write)//C转换为Cpp;{int first = fgetc(read);int second = 0;switch(first){case '*':second = fgetc(read);if(second == '/')//舍弃 */;{int third = fgetc(read);state = NULL_START ;if(third != '\n'){fputc('\n',write);ungetc(third,read);//ungetc函数的功能是将已读数据还回缓冲区;}if(third == '\n'){fputc(third,write);}}else{fputc(first,write);ungetc(second,read);//将*之后的内容还回缓冲区;}break;case '\n'://如果是换行,那就是连续注释,就将下一行开头加入Cpp注释;fputc(first,write);fputc('/',write);fputc('/',write);break;case EOF:fputc(first,write);state = END_START ;break;default:fputc(first,write);break;}} void DoCppState(FILE *read,FILE *write)//Cpp转换为C;{int first = 0;first = fgetc(read);switch(first){case'\n'://Cpp注释的换行就是一行注释的结束;fputc(first,write);state = NULL_START ;break;case EOF:fputc(first,write);state = END_START ;break;default :fputc(first,write);break;}}void ConvertWork(FILE *read,FILE *write)//函数操作选项;{state = NULL_START ;//一开始我们选择无状态while(state != END_START ){switch(state){case NULL_START :DoNullState(read,write);break;    case C_START  :            DoCState(read,write);break;case CPP_START  :DoCppState(read,write);break;default:break;}}}void CommentConvert()//读写文件函数;{FILE *pWrite = NULL;//打开提前编辑好的"input.c"文件;FILE *pRead = fopen(INPUTFILENAME,"r");if(pRead == NULL){perror("open file for read");exit(EXIT_FAILURE );}//写入新创建的"output.c"文件;pWrite = fopen(OUTPUTFILENAME, "w");if(pWrite == NULL){fclose(pRead );    perror ("open file for write");exit(EXIT_FAILURE );}//调用操作选项函数;//关闭已经打开的文件;ConvertWork(pRead,pWrite);fclose(pRead );fclose (pWrite );}



# 主函数部分:

#include"CommentConvert.h"void test(){CommentConvert();}int main(){test();system("pause");return 0;}


# 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*/

# 函数执行结果 “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*/




简单的注释转换功能, 功能比较单一,有时间我会继续完善!

Ps: 爱拼才会赢!

Thanks!
0 0
原创粉丝点击