C语到C++注释转换小项目
可将其分为下面四个状态进行讨论即可:

#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++注释转换小项目的更多相关文章
- python网页爬虫小项目开发
这是我最近接的一个小项目,花了是整整四天多时间. 任务是将http://www.examcoo.com/index/detail/mid/7网站下所有的试卷里的试题全部提取出来,首先按照题型进行分类, ...
- web实践小项目<一>:简单日程管理系统(涉及html/css,javascript,python,sql,日期处理)
暑假自学了些html/css,javascript和python,苦于学完无处练手几乎过目即忘...最后在同学的建议下做了个简单日程管理系统.借第一版完成之际,希望能将实践期间犯过的错误和获得的新知进 ...
- IOS-小项目(饿了么 网络部分 简单实现)
在介绍小项目之前,在此说明一下此代码并非本人所写,我只是随笔的整理者. 在介绍之前先展现一下效果图. 看过效果图大家应该很熟悉了,就是饿了么的一个界面而已,值得注意的是,实现时并没有采用本地连接,而是 ...
- 每日学习心得:SQL查询表的行列转换/小计/统计(with rollup,with cube,pivot解析)
2013-8-20 1. SQL查询表的行列转换/小计/统计(with rollup,with cube,pivot解析) 在实际的项目开发中有很多项目都会有报表模块,今天就通过一个小的SQL ...
- Ado.Net小练习02(小项目CUID
前台界面: 后台代码: namespace ado.net小项目cuid { public partial class Form1 : Form { //连接字符串 ...
- testservice小项目总结
关于自做小项目testservice的总结: 1.Activity与Service的绑定及之间的通信: 1)关于Activity和Service的生命周期的理解: 2)bindService方法中Se ...
- SQL查询表的行列转换/小计/统计(with rollup,with cube,pivot解析)
SQL查询表的行列转换/小计/统计(with rollup,with cube,pivot解析) 2013-8-20 1. SQL查询表的行列转换/小计/统计(with rollup,with ...
- Vue + WebApi 小项目:构造自己的在线 Markdown 笔记本应用
Vue + WebApi 小项目:构造自己的在线 Markdown 笔记本应用 目录 概要 知识点 完整示例图 代码与资源文件 流程步骤 概要 基于 MVP 最小可行性产品设计理念,我们先完成一个可以 ...
- Sudoku 小项目
Sudoku 小项目 - 软工第二次作业 Part 1 · 项目相关 Github 地址: https://github.com/TheSkyFucker/Sudoku 项目的更多信息以及所有开发文档 ...
随机推荐
- 联动加入redmine的wik
<? php error_reporting(E_ERROR); date_default_timezone_set('Asia/Shanghai'); $red_server = " ...
- Python源代码剖析笔记3-Python运行原理初探
Python源代码剖析笔记3-Python执行原理初探 本文简书地址:http://www.jianshu.com/p/03af86845c95 之前写了几篇源代码剖析笔记,然而慢慢觉得没有从一个宏观 ...
- 【SqlServer】【问题收集】删除同一张表中完全相同的记录
1 概述 在Sqlserver中,当通过SqlServer设计器删除同一张表中两条完全相同的记录时,会弹出如下提示: 点击“是” 弹出如下提示,不让删除 2 问题解决 这个问题很简单,用DEL ...
- IDEA+PHP+XDebug调试配置
XDebug调试配置 临时需要调试服务器上的PHP web程序,因此安装xdebug,下面简单记录 安装xdebug 下载最新并解压 wget https://xdebug.org/files/xde ...
- bandit_pass
boJ9jbbUNNfktd78OOpsqOltutMc3MY1CV1DtqXWVFXTvM2F0k09SHz0YwRINYA9UmHadQclWmgdLOKQ3YNgjWxGoRMb5luKpIwr ...
- PHP csv文件内容转成数组/Json
$lines = array_map('str_getcsv', file($filePath));; $result = array(); $headers = null; if (count($l ...
- 这么说吧,java线程池的实现原理其实很简单
好处 : 线程是稀缺资源,如果被无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,合理的使用线程池对线程进行统一分配.调优和监控,有以下好处: 1.降低资源消耗: 2.提高响应速度: 3.提高线 ...
- .NET 构造Class返回多个json值
上次总结使用DataTable返回多个值,后来看到一个小哥的返回方式和我的有所不同,便留意了一下.原来他构造一个Class,而我构造的是一个Table. 首先说说两者的区别:拿student举例,st ...
- MySQL学习(二)复制
复制解决的问题是保持多个服务器之间的数据的一致性,就如同通过复制保持两个文件的一致性一样,只不过MySQL的复制要相对要复杂一些,其基本过程如下: 1)在主库上将数据更改记录到二进制日 ...
- 智能合约语言 Solidity 教程系列6 - 结构体与映射
写在前面 Solidity 是以太坊智能合约编程语言,阅读本文前,你应该对以太坊.智能合约有所了解, 如果你还不了解,建议你先看以太坊是什么 本系列文章一部分是参考Solidity官方文档(当前最新版 ...
