单个.c文件的转换思路:

由一个input.c经过注释转换生成一个转化好的output.c文件

由C注释向C++注释转换可分为以下几种情况:

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

各个状态之间的转换关系

一个文件中包含的内容包括:c注释、c++注释、正常代码、文件结束标志四个内容。具体转换关系如图:

具体代码如下:

头文件:Commentconvert.h

#ifndef __COMMENT_CONVERT_H__
#define __COMMENT_CONVERT_H__#include<stdio.h>
#include<stdlib.h>
typedef enum State
{NUL_STATE,C_STATE,CPP_STATE,END_STATE
}State;void Commentconvert(FILE* pfRead, FILE* pfWrite);
void DoNULState(FILE* pfRead, FILE* pfWrite, State* ps);
void DoCState(FILE* pfRead, FILE* pfWrite, State* ps);
void DoCPPState(FILE* pfRead, FILE* pfWrite, State* ps);
void DoENDState(FILE* pfRead, FILE* pfWrite, State* ps);#endif//__COMMENT_CONVERT_H__

测试代码:test.c

#define _CRT_SECURE_NO_WARNINGS
#include"Commentconvert.h"
void test()
{FILE *pfRead = NULL;FILE *pfWrite = NULL;pfRead = fopen("input.c", "r");if (pfRead == NULL){perror("openfile for read:");exit(EXIT_FAILURE);}pfWrite = fopen("output.c", "w");if (pfWrite == NULL){perror("open file for write:");exit(EXIT_FAILURE);}//注释转换Commentconvert(pfRead, pfWrite);fclose(pfRead);pfRead = NULL;fclose(pfWrite);pfWrite = NULL;
}int main()
{test();system("pause");return 0;
}

实现代码:Commentconvert.c

#define _CRT_SECURE_NO_WARNINGS
#include"Commentconvert.h"void Commentconvert(FILE* pfRead, FILE* pfWrite)
//状态机
{State state = NUL_STATE;while (state != END_STATE){switch (state){case NUL_STATE:DoNULState(pfRead, pfWrite, &state);break;case C_STATE:DoCState(pfRead, pfWrite, &state);break;case CPP_STATE:DoCPPState(pfRead, pfWrite, &state);break;case END_STATE:break;}}}
void DoNULState(FILE* pfRead, FILE* pfWrite, State* ps)
{int first = fgetc(pfRead);switch (first){case '/':{int second = fgetc(pfRead);switch (second){case '*':{//c状态fputc('/', pfWrite);fputc('/', pfWrite);*ps = C_STATE;}break;case '/':{//c++状态fputc(first, pfWrite);fputc(second, pfWrite);*ps = CPP_STATE;}break;default:{fputc(first, pfWrite);fputc(second, pfWrite);}break;}}break;case EOF:fputc(first, pfRead);*ps = END_STATE;break;default:fputc(first, pfWrite);break;}
}
void DoCState(FILE* pfRead, FILE* pfWrite, State* ps)
{int first = fgetc(pfRead);switch (first){case '*':{int second = fgetc(pfRead);switch (second){case '/':{*ps = NUL_STATE;int third = fgetc(pfRead);if (third == '\n')//是否有换行{fputc(third, pfWrite);}else{fputc('\n', pfWrite);ungetc(third, pfRead);//补充了换行符,读取的第三个字符要还回去,避免丢失}}break;default:{fputc(first, pfWrite);ungetc(second, pfRead);}break;}}break;case '\n':{fputc(first, pfWrite);fputc('/', pfWrite);fputc('/', pfWrite);}break;default:fputc(first, pfWrite);break;}}void DoCPPState(FILE*pfRead, FILE*pfWrite, State* ps){int first = fgetc(pfRead);switch (first){case '\n':{fputc('\n', pfWrite);*ps = NUL_STATE;}break;case EOF:{fputc(first, pfWrite);*ps = END_STATE;}break;default:fputc(first, pfWrite);break;}}

测试结果:

由C注释向C++注释转换简单实现相关推荐

  1. 使用VA助手如何快速添加注释(按doxygen注释规范)

    原文首发于微信公众号「3D视觉工坊」:使用VA助手如何快速添加注释(按doxygen注释规范) 首先,关于VA助手的破解安装教程,请参考:VS2015 Visual Assist X 破解版安装教程 ...

  2. 回调函数自定义传参_koroFileHeader:一个用于生成文件头部注释和函数注释的插件...

    小金子 读完需要 2分钟 速读仅需 1 分钟 大家好,我是你们的小金子. 今天给大家分享的这个工具呢?对于使用 VS Code 的同学来讲,是一个好东西. koroFileHeader,一个在 vsc ...

  3. powerDesigner 正向工程生成sql注释问题 (mysql注释问题)

    为什么80%的码农都做不了架构师?>>>    1:powerDesigner 使用过程发现其工具内置很多默认是支持oracle的 ,而我现在用mysql ,于是修改配置 2:pow ...

  4. pycharm 自动生成文件注释和函数注释

    1. 文件注释 pycharm提供了一个在新建文件自动生成文件头注释的功能,可以实现自动生成运行环境,作者.日期等必要信息,使用比较方便,配置十分简单.在anaconda 的spider也有类似的功能 ...

  5. 使用.NET中的XML注释(一) -- XML注释标签讲解

    使用.NET中的XML注释(一) -- XML注释标签讲解 作者:Xt Idt  来源:博客园  发布时间:2011-04-02 11:46  阅读:9 次  原文链接   [收藏]   一.摘要 . ...

  6. jsp界面自动生成文件注释_实施注释界面

    jsp界面自动生成文件注释 对于Java开发人员而言,每天都需要使用注释. 如果没有其他简单的@Override注释,那该响了. 创建注释要复杂一些. 在运行时通过反射使用"自制" ...

  7. C语言注释与C++注释的相互转换

    做此项目的经历主要的收获是熟悉了状态机这一方法的使用,还有就是对每实现一个功能就尽量封装一个函数这一概念把握的更为精到. 状态机:关于状态机的一个极度确切的描述是它是一个有向图形,由一组节点和一组相应 ...

  8. C注释   转换为   C++注释

    // 1.一般情况 /* int i = 0; */ // 2.换行问题 /* int i = 0; */int m = 0; /* int i = 0; */ int j = 0; // 3.匹配问 ...

  9. Intellj Idea 如何设置类头注释和方法注释

    intellj idea 如何设置类头注释和方法注释         intellj idea的强大之处就不多说了,相信每个用过它的人都会体会到,但是我们也会被他的复杂搞的晕头转向,尤其刚从eclip ...

最新文章

  1. fcm算法的MATLAB实现,FCM算法的matlab程序(初步)
  2. Vue打包之后会出现.map文件用处
  3. Android笔记(三十一)Android中线程之间的通信(三)子线程给主线程发送消息...
  4. HTTP详解(转载)
  5. 火狐 和 IE 透明度的设置。
  6. 论文投稿新规则,不用跑出SOTA,还能“内定”发论文?!
  7. python进阶20装饰器
  8. Python+PyQt5构建电影天堂电影搜索工具
  9. 33个CadQuery程序化建模实例
  10. html隐藏汉堡按钮,12种汉堡包图标按钮变形动画特效
  11. CTF Crypto简单题学习思路总结(持续更新)
  12. java的对象存储在哪里?
  13. 用devc++表白_【建大表白墙】19级倪yl,风吹起如花般破碎的流年,而你的笑容摇晃摇晃,成为我命途中最美的点缀...
  14. 5G无用时代的终结—从iPhone 12系列到vivo 6G应用场景的展望
  15. 2019年—可能是我们Java程序员离危机感最近的一年!
  16. 至尊宝android.phone,Android至尊宝 索尼爱立信X10i行货评测
  17. yarn的三种调度器
  18. 信息学奥赛真题解析(美国信息学回文数)
  19. python使用ctypes调用c/c++函数
  20. CAD制图初学入门常见问题秘笈,助你摆脱节后综合症!(上)

热门文章

  1. 情侣的网站代码java_GitHub - 90x64/lovers-website: 程序员的情侣网站 (programmer's website of lovers)...
  2. MacBook Air安装Win7的经验总结(包括双系统,单系统WIN7)
  3. Spark简介、生态系统
  4. ubuntu--ogv格式转mp4格式
  5. 什么是PUGC、UGC、PGC、OGV、PUGV,了解视频平台运营模式
  6. 进程的同步和互斥反映了_用信号量解决进程的同步与互斥探讨【持续更新】
  7. 四川阆中2021中学高考成绩查询入口,2021年四川高考体检报告结果查询时间及查询网址入口...
  8. ipad未能与itunes连接到服务器,ipad无法连接itunes store怎么办
  9. 8年京东大数据架构师推荐的大数据开发学习路线
  10. 写全武汉的火锅店..更新版 恩..欢迎补充 ^_^