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

 #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. NYOJ 480 Fibonacci Again!

    Fibonacci Again! 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描写叙述 求第n个斐波那契数是否是一个素数,n为整数 f[n]=f[n-1]+f[n-2] ( ...

  2. gulp提高微信小程序开发效率

      最近公司要求把一套公众号项目的页面迁移到小程序,也就意味着要重新敲一份代码,不能更繁琐了,为了节省时间,提高迁移效率,就决定自己动手用gulp搭一个简易的小程序框架,再记录一下搭建过程.希望有大神 ...

  3. 获取本地ip

    public void GetLocalIP(string username) { List<string> strIPs = new List<string>(); Netw ...

  4. 把项目放到码云上,通过git 进行项目管理

    1.在码云上新建一个项目 把使用 Readme文件初始化这个项目这个勾选去掉  项目生成后会看到 码云的git 简易的命令行入门教程: Git 全局设置: git config --global us ...

  5. 挂载mount、卸载umount、挂载光盘U盘

    mount [root@localhost ~]# mount sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime,seclabel) ...

  6. lograted日志切割脚本

    root@op-testsetup-web3.idc1.yiducloud.cn:/etc/logrotate.d# cat etcd /home/work/docker/logs/etcd/prev ...

  7. Java定时器应用

    在Java多线程中,有的时候,我们需要按照指定间隔时间来执行一些任务,这时,我们就要用到定时器.我们在这里以Java中的Timer定时器为例,演示定时器的应用. 请看下述代码: import java ...

  8. ArcGIS 网络分析[2.3] 最近设施点

    什么是最近设施点? 仍然举一个生动形象例子说明. 我在大街的某一个点儿上,我急需上厕所,问:我3分钟内能到的最近的厕所在哪? 这就是最近设施点分析(ClosestFacility)--给定搜索半径,基 ...

  9. bzoj 1996: [Hnoi2010]chorus 合唱队

    Description Input Output Sample Input 4 1701 1702 1703 1704 Sample Output 8 HINT Source 因为只会在区间的两端进行 ...

  10. bzoj 4813: [Cqoi2017]小Q的棋盘

    Description 小Q正在设计一种棋类游戏.在小Q设计的游戏中,棋子可以放在棋盘上的格点中.某些格点之间有连线,棋子只能 在有连线的格点之间移动.整个棋盘上共有V个格点,编号为0,1,2-,V- ...