可将其分为下面四个状态进行讨论即可:

 #include<stdio.h>
#include<windows.h>
#define INPUTFILE "input.c"
#define OUTPUTFILE "output.c" enum Status{
NULLSTATUS,
CPPSTATUS,
CSTATUS,
EOFSTATUS,
};
int status = NULLSTATUS; void do_null_status(FILE *ifp,FILE *ofp){ // 初始态为普通状态 (没有参与注释部分的内容 )
int c1=fgetc(ifp);
switch(c1){
case '/':{
int c2 = getc(ifp);
switch(c2){ // .../*
case '*':
fputc('/',ofp);
fputc('/',ofp);
status = CSTATUS;
break;
case '/': // ... //
fputc('/',ofp);
fputc('/',ofp);
status = CPPSTATUS;
break;
case EOF:
fputc('/',ofp);
status = EOFSTATUS;
break;
default: // .../ ...
fputc('/',ofp);
fputc(c2,ofp);
break;
}
break;
}
case EOF:
status = EOFSTATUS;
break;
default:
fputc(c1,ofp);
break;
}
}
void do_cpp_status(FILE *ifp,FILE *ofp){ // 已进入C++风格注释(// ...) 保持此种风格注释
int c = fgetc(ifp);
switch (c) {
case '\n' : // ....\n
fputc('\n',ofp);
status = NULLSTATUS;
break;
case EOF :
status = EOFSTATUS;
break;
default:
fputc(c, ofp);
break;
}
}
void do_c_status(FILE *ifp,FILE *ofp){ // 进入C风格注释 ( /* ...) 目的改为C++风格注释
int c1= fgetc(ifp);
switch(c1)
{
case '*':{
int c2= fgetc(ifp);
switch(c2){
case '/' : // //...*/...
fputc('\n' ,ofp);
status = NULLSTATUS;
break;
case EOF:
fputc('*' ,ofp);
status = EOFSTATUS;
default:
fputc('*',ofp);
ungetc(c2, ifp); //这个地方调了好多遍才注意到,实在是愚钝。
break;
}
break;
}
case '\n': // /* ... \n
fputc('\n', ofp);
fputc('/' , ofp);
fputc('/' , ofp);
break;
case EOF:
status= EOFSTATUS;
break;
default: // /* ...
fputc(c1,ofp);
break;
}
}
void convert_work(FILE *ifp,FILE *ofp){
while( status != EOFSTATUS){
switch(status){
case NULLSTATUS :
do_null_status(ifp,ofp);
break;
case CPPSTATUS :
do_cpp_status(ifp,ofp);
break;
case CSTATUS :
do_c_status(ifp,ofp);
break;
case EOFSTATUS:
break;
default:
break;
}
}
}
int main(){
FILE *ifp=fopen(INPUTFILE,"r");
FILE *ofp=fopen(OUTPUTFILE,"w");
if(ifp == NULL || ofp == NULL){
perror(" Open failed\n");
exit();
}
convert_work(ifp , ofp);
fclose(ifp);
fclose(ofp);
system("pause");
return ;
} 实例测试:
 

C语到C++注释转换小项目的更多相关文章

  1. python网页爬虫小项目开发

    这是我最近接的一个小项目,花了是整整四天多时间. 任务是将http://www.examcoo.com/index/detail/mid/7网站下所有的试卷里的试题全部提取出来,首先按照题型进行分类, ...

  2. web实践小项目<一>:简单日程管理系统(涉及html/css,javascript,python,sql,日期处理)

    暑假自学了些html/css,javascript和python,苦于学完无处练手几乎过目即忘...最后在同学的建议下做了个简单日程管理系统.借第一版完成之际,希望能将实践期间犯过的错误和获得的新知进 ...

  3. IOS-小项目(饿了么 网络部分 简单实现)

    在介绍小项目之前,在此说明一下此代码并非本人所写,我只是随笔的整理者. 在介绍之前先展现一下效果图. 看过效果图大家应该很熟悉了,就是饿了么的一个界面而已,值得注意的是,实现时并没有采用本地连接,而是 ...

  4. 每日学习心得:SQL查询表的行列转换/小计/统计(with rollup,with cube,pivot解析)

    2013-8-20 1.    SQL查询表的行列转换/小计/统计(with  rollup,with cube,pivot解析) 在实际的项目开发中有很多项目都会有报表模块,今天就通过一个小的SQL ...

  5. Ado.Net小练习02(小项目CUID

    前台界面: 后台代码: namespace ado.net小项目cuid {     public partial class Form1 : Form     {         //连接字符串   ...

  6. testservice小项目总结

    关于自做小项目testservice的总结: 1.Activity与Service的绑定及之间的通信: 1)关于Activity和Service的生命周期的理解: 2)bindService方法中Se ...

  7. SQL查询表的行列转换/小计/统计(with rollup,with cube,pivot解析)

    SQL查询表的行列转换/小计/统计(with rollup,with cube,pivot解析) 2013-8-20 1.    SQL查询表的行列转换/小计/统计(with  rollup,with ...

  8. Vue + WebApi 小项目:构造自己的在线 Markdown 笔记本应用

    Vue + WebApi 小项目:构造自己的在线 Markdown 笔记本应用 目录 概要 知识点 完整示例图 代码与资源文件 流程步骤 概要 基于 MVP 最小可行性产品设计理念,我们先完成一个可以 ...

  9. Sudoku 小项目

    Sudoku 小项目 - 软工第二次作业 Part 1 · 项目相关 Github 地址: https://github.com/TheSkyFucker/Sudoku 项目的更多信息以及所有开发文档 ...

随机推荐

  1. Java并发与同步

    Java中并发的形式无非是多线程和多进程两种形式.这两种形式都是能够利用多核来发挥计算能力的. 先说并发: 多进程意味着同一时候执行多个JVM.这个代价通常比多线程高,每一个JVM都有自己的堆栈.都要 ...

  2. JAVA-UML

    UML(UnifiedModelingLanguage)(统一建模语言或标准建模语言) 它是模型化的软件系统开发图形语言 为软件开发所有阶段提供模型化,可视化支持 UM2.2中定义了14中图示 三种常 ...

  3. 游戏AI(三)—行为树优化之基于事件的行为树

    上一篇我们讲到了关于行为树的内存优化,这一篇我们将讲述行为树的另一种优化方法--基于事件的行为树. 问题 在之前的行为树中,我们每帧都要从根节点开始遍历行为树,而目的仅仅是为了得到最近激活的节点,既然 ...

  4. java并发编程的艺术——第一章总结

    并发编程的挑战 1.1上下文切换 1.2死锁 1.3资源限制的挑战 1.4本章小结 1.1上下文切换 1.1.1多线程一定快吗 1.1.2测试上下文切换次数和时长 1.1.3如何减少上下文切换 1.1 ...

  5. 自学WPF之Binding(二)

    没有Source的Binding,使用ContentText作为Binding源: 上一篇是把CLR类型对象当作指定为Binding的Source,两种方法:一是把对象赋值给Binding.Sourc ...

  6. 如何解决更新被拒绝,因为远程版本库包含您本地尚不存在的提交。这通常是因为另外 提示:一个版本库已向该引用进行了推送。再次推送前,您可能需要先整合远程变更 提示:(如 'git pull ...')。

    不要通过网页提交,通过网页提交一次,然后在终端再次push的时候,会认为网上代码仓库已经被其他地方提交过一次代码,此时会拒绝终端push 这个时候只能是pull,然后才能再次在终端提交. 也就是说,避 ...

  7. 理解Vue中的Render渲染函数

    理解Vue中的Render渲染函数 VUE一般使用template来创建HTML,然后在有的时候,我们需要使用javascript来创建html,这时候我们需要使用render函数.比如如下我想要实现 ...

  8. Python笔记·第十一章—— 函数 (二) 装饰器

    一 为何要用装饰器 有的时候写完一段代码,过段时间需要对它进行升级.添加一些新功能,但是如果要直接修改原来的代码会影响其他人的调用,所以就需要一个不修改源代码且不修改原函数的调用方式的东西又能为原函数 ...

  9. CSS line-height概念与举例

    本文同时发表在https://github.com/zhangyachen/zhangyachen.github.io/issues/37 定义 两行文字基线之间的距离. 基线的大体位置 基线的位置可 ...

  10. Xamarin android如何反编译apk文件

    Xamarin android 如何反编译 apk文件 这里推荐一款XamarinAndroid开发的小游戏,撸棍英雄,游戏很简单,的确的是有点大.等一下我们来翻翻译这个Xamarin Android ...