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

 #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. 联动加入redmine的wik

    <? php error_reporting(E_ERROR); date_default_timezone_set('Asia/Shanghai'); $red_server = " ...

  2. Python源代码剖析笔记3-Python运行原理初探

    Python源代码剖析笔记3-Python执行原理初探 本文简书地址:http://www.jianshu.com/p/03af86845c95 之前写了几篇源代码剖析笔记,然而慢慢觉得没有从一个宏观 ...

  3. 【SqlServer】【问题收集】删除同一张表中完全相同的记录

    1   概述 在Sqlserver中,当通过SqlServer设计器删除同一张表中两条完全相同的记录时,会弹出如下提示: 点击“是” 弹出如下提示,不让删除 2   问题解决 这个问题很简单,用DEL ...

  4. IDEA+PHP+XDebug调试配置

    XDebug调试配置 临时需要调试服务器上的PHP web程序,因此安装xdebug,下面简单记录 安装xdebug 下载最新并解压 wget https://xdebug.org/files/xde ...

  5. bandit_pass

    boJ9jbbUNNfktd78OOpsqOltutMc3MY1CV1DtqXWVFXTvM2F0k09SHz0YwRINYA9UmHadQclWmgdLOKQ3YNgjWxGoRMb5luKpIwr ...

  6. PHP csv文件内容转成数组/Json

    $lines = array_map('str_getcsv', file($filePath));; $result = array(); $headers = null; if (count($l ...

  7. 这么说吧,java线程池的实现原理其实很简单

    好处 : 线程是稀缺资源,如果被无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,合理的使用线程池对线程进行统一分配.调优和监控,有以下好处: 1.降低资源消耗: 2.提高响应速度: 3.提高线 ...

  8. .NET 构造Class返回多个json值

    上次总结使用DataTable返回多个值,后来看到一个小哥的返回方式和我的有所不同,便留意了一下.原来他构造一个Class,而我构造的是一个Table. 首先说说两者的区别:拿student举例,st ...

  9. MySQL学习(二)复制

        复制解决的问题是保持多个服务器之间的数据的一致性,就如同通过复制保持两个文件的一致性一样,只不过MySQL的复制要相对要复杂一些,其基本过程如下:     1)在主库上将数据更改记录到二进制日 ...

  10. 智能合约语言 Solidity 教程系列6 - 结构体与映射

    写在前面 Solidity 是以太坊智能合约编程语言,阅读本文前,你应该对以太坊.智能合约有所了解, 如果你还不了解,建议你先看以太坊是什么 本系列文章一部分是参考Solidity官方文档(当前最新版 ...