注释转换(c->c++)小项目
来源:互联网 发布:知り合いです 编辑:程序博客网 时间:2024/06/04 20:06
程序新思路:
注释转换一开始去想的时候,会觉得很复杂。因为在一个源文件里出现注释的情况虽然不会太多,但是可能会出现各种各样,形形色色的注释,在转换程度上去想的时候会觉得很复杂,不同的问题都要有不同的解决方法的。
在这里简单的罗列注释转换可能出现的几种情况:
// 1.一般情况int num = 0;/* 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*/
在注释转换的时候肯定不仅仅只有这些问题,可能有些也没有想到位。所以我们会发现要处理的情况会很多,如果一个一个问题挨个解决的话,代码就会有复杂性。我们可以这样去给一个思路:
图中:注释转换过程使用了有限状态机,可以给我们提供一个新的思路。把注释转换切换到4中状态中,根据有限的条件进入相应的状态下去处理,并在根据条件进入下一个状态,依次循环,直到遇到eof结束。
有限状态机(finite state machine)是一个数学概念,如果把它运用于程序中,可以发挥很大的作用。它是一种协议,用于有限数量的子程序(“状态”)的发展变化。每个子程序进行一些处理并选择下一种状态(通常取决于下一段输入)。有限状态机(FSM)可以用作程序的控制结构。
程序代码:
头文件AnnotationConversion.h
#ifndef __ANNOTATIONCONVERSION_H__#include<stdio.h>#include<windows.h>#define CHMOD "input.c"#define FINAL "output.c"typedef enum STATE //枚举定义四种状态{ NULL_STATE, C_STATE, CPP_STATE, EOF_STATE,}STATE;void Execute(FILE* pfin, FILE* pfout);//转换函数void DoNULLConvert(FILE* pfin, FILE* pfout,STATE *state);//普通状态void DoCConvert(FILE* pfin, FILE* pfout, STATE *state);//C状态函数void DoCPPConvert(FILE* pfin, FILE* pfout, STATE *state);//C++状态函数#endif//__ANNOTATIONCONVERSION_H__
实现部分AnnotationConversion.c
#include "AnnotationConversion.h"void Execute(FILE* pfin, FILE* pfout)//转换函数{ STATE state = NULL_STATE; //定义初始状态为普通状态 while (state != EOF_STATE) { switch (state) { case NULL_STATE: DoNULLConvert(pfin, pfout, &state); break; case C_STATE: DoCConvert(pfin, pfout, &state); break; case CPP_STATE: DoCPPConvert(pfin, pfout, &state); break; default: break; } }}void DoNULLConvert(FILE* pfin, FILE* pfout, STATE *state)//普通状态操作函数{ int first = fgetc(pfin); switch (first) { case '/': //普通状态遇到/后,紧接着判断下一个字符。 { int second = fgetc(pfin); switch (second) { case '/': //遇到//依然输出//并进入c++注释状态 { fputc(first, pfout); fputc(second, pfout); *state = CPP_STATE; } break; case '*': //遇到/*依然输出//并进入c注释状态 { fputc(first, pfout); fputc('/', pfout); *state = C_STATE; } break; default://正常语句:(例如/hehe/),直接写进文件。 { fputc(first, pfout); fputc(second, pfout); } break; } } break; case EOF: //结束标志 { *state = EOF_STATE; } break; default: //正常语句 { fputc(first, pfout); } break; }}void DoCConvert(FILE* pfin, FILE* pfout, STATE *state)//c注释状态操作函数{ int first = fgetc(pfin); switch (first) { case '*': //遇到*,同样紧接着判断下一下个字符 { int second = fgetc(pfin); switch (second) { case '/': //如果是/,表示注释结束,直接回到空状态 { *state = NULL_STATE; int third = fgetc(pfin); //获取第三个字符是因为可能出现(/*hehe*/int i = 0;)这种情况 if ('\n' == third) { fputc(third, pfout); } else { fputc('\n', pfout); ungetc(third, pfin); } } break; default: //针对/***/情况 fputc(first, pfout); ungetc(second, pfin); break; } } break; case '\n': //针对多行C语言注释问题 { fputc(first, pfout); fputc('/', pfout); fputc('/', pfout); } break; default: fputc(first, pfout); break; }}void DoCPPConvert(FILE* pfin, FILE* pfout, STATE *state)//C++注释转换操作函数{ int first = fgetc(pfin); switch (first) { case '\n': { fputc(first,pfout); *state = NULL_STATE; } break; case EOF: *state = EOF_STATE; break; default: fputc(first, pfout); break; }}
测试部分test.c
针对fopen、fread、fwrite三个函数在我之前写的文件流通讯录中有详细解释http://blog.csdn.net/quinn0918/article/details/72526886
#include "AnnotationConversion.h"#pragma warning (disable:4996)int main(){ FILE* pfread = fopen(CHMOD, "r"); if (pfread == NULL) { perror("out of for read"); exit(1); } FILE* pfwrite = fopen(FINAL, "w"); if (pfwrite == NULL) { fclose(pfread); perror("out of for write"); exit(1); } Execute(pfread, pfwrite); printf("转换成功\n"); fclose(pfread); fclose(pfwrite); system("pause"); return 0;}
针对前面一开始提出的问题,程序运行注释转换后结果为:
阅读全文
0 0
- 注释转换(c->c++)小项目
- C语言小项目—注释转换( C注释转换为C++注释 )
- C语言小项目—注释转换
- c语言小项目----注释转换
- C语言小项目---注释转换
- C语言小项目-注释转换
- c语言小项目---注释转换
- C/C++小项目之注释转换
- C的小项目:注释转换
- C语言小项目--注释转换
- 注释转换小项目(c注释->到c++注释)
- 小项目之C注释转换为C++注释状态
- C注释转换为C++注释小项目
- 注释转换项目(c->c++)
- 【C项目】注释转换项目
- 【小项目】注释风格转换(从C语言注释风格转换到C++注释风格)
- C语言小项目制作之---注释转换
- c语言项目-注释转换
- Nan空值
- 品质化时代 CP如何把控手游产品质量关
- 算法谜题97 topswops游戏
- 初识jQuery之--样式表-显示-隐藏
- 企业大型互联网分布式架构{Java分布式架构 dubbo + springmvc + mybatis + ehcache + redis }
- 注释转换(c->c++)小项目
- Java获取照片EXIF信息
- 元器件的非线性与线性
- 处理交互分区
- Ruby生成随机元素
- CustomToast避免一直弹弹弹
- RadioButton 和 CheckBox 浅析
- [Windows驱动开发](三)基础知识——驱动例程
- java程序运行机制