注释转换
来源:互联网 发布:骑马钉排版软件 编辑:程序博客网 时间:2024/06/07 03:51
主功能函数:
#include<stdio.h> #include"convert.h" //引自己定义的头文件int status = NULSTAT; //定义全局变量,用于显示当前状态void do_nul(FILE *ifp,FILE *ofp)//正常无注释情况下的工作{ char c = fgetc(ifp); //从文件中读取一个字符 switch (c) //判断字符c { case '/': //若字符为‘/’,再判断下一个字符 { char s = fgetc(ifp); switch (s) { case '/': fputc('/', ofp); fputc('/', ofp); status = CPPSTAT; //c为/,s为/,进入c++注释 break; case '*': fputc('/', ofp); fputc('/', ofp); status = CSTAT; //c为/,s为*,进入c注释 break; default: fputc('/', ifp); //s为普通字符,输出‘/’ break; }} break; case '\n': //字符c为换行符,输出换行符在目标文件,状态变为无 //注释状态 fputc(c, ofp); status = NULSTAT; break; case EOF: //字符c为文件结束标志,则执行文件结束状态的工作 status = EOFSTAT; break; default: fputc(c, ofp); //字符c为正常字符,则正常输出,状态变为 //无注释状态 status =NULSTAT; break; }}void do_c(FILE *ifp, FILE *ofp) //c注释状态的工作{ //此工作状态下已有“/*” char c = fgetc(ifp); //判断后续字符 switch (c) { case '*': //若碰见字符‘*’,判断是否注释结束 {char s = fgetc(ifp); switch (s) { case '/': fputc('\n', ofp); // 此时有“*/” status = NULSTAT; //状态变为无注释状态 break; default: //否则输出字符*,将字符s退回到ifp;将状态变为c状态 fputc(c, ofp); ungetc(s, ifp); status =CSTAT; break; } } break; case '\n'://若字符c为换行符,输出换行符,再输出c++注释符“//” fputc('\n', ofp); fputc('/', ofp); fputc('/', ofp); status = CSTAT;//状态为C注释 break; case EOF: status = EOFSTAT; break; default: fputc(c, ofp); status = CSTAT; break; }}void do_cpp(FILE *ifp, FILE *ofp) //c++注释状态下的工作{ char c = fgetc(ifp); switch (c) { case '\n': fputc(c, ofp); status = NULSTAT; break; case EOF: status = EOFSTAT; break; default: fputc(c, ofp); status = CPPSTAT; break; }}void convert(FILE *ifp, FILE *ofp) //主函数{ while (status != EOFSTAT) //判断状态,选择执行什么 //状态下的工作 { switch (status) { case NULSTAT: do_nul(ifp, ofp); break; case CSTAT: do_c(ifp, ofp); break; case CPPSTAT: do_cpp(ifp, ofp); break; case EOF: break; default: break; } }}
自定义头文件
#ifndef CONVERT_H
#define CONVERT_H
void convert(FILE *ifp, FILE *ofp);
enum{NULSTAT,CSTAT,CPPSTAT,EOFSTAT};
#define INPUT “input.txt”
#define OUTPUT “output.txt”
#endif
#include<stdio.h> #include<stdlib.h> #include"convert.h"int main(){ FILE *ifp = fopen(INPUT, "r"); FILE *ofp = fopen(OUTPUT, "w"); if (ifp == NULL || ofp == NULL) { fprintf(stderr,"open file error"); exit(1); } convert(ifp, ofp); fclose(ifp); fclose(ofp); system("pause"); return 0;}
测试用例:
// 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. 连续注释问题
/int a = 0;//int b = 0;/
// 6. 连续的 **/问/
// 7.C++ 注释问题
:
/ /*xxxxx
输出结果
// 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. 连续注释问题//int a = 0;//int b = 0;// 6. 连续的 **/问题//*// 7.C++ 注释问题// /*xxxxxxxxxxxx*/
阅读全文
0 0
- 注释转换
- 注释转换
- 注释转换
- 注释转换
- 注释转换
- 注释转换
- 注释转换
- 注释转换
- 注释转换
- 注释转换
- 注释转换
- 注释转换
- 注释转换
- 注释转换
- 注释转换
- 注释转换
- 注释转换
- 注释转换
- YOLO Darknet
- Studio如何给log添加过滤项
- 大数据学习34:grafana 安装 和 Nginx 、EL 联调
- MySql索引实现原理
- 解决两个 Android 模拟器之间无法网络通信的问题
- 注释转换
- python redis-py使用
- 可搭配ViewPager相互控制的弹性动画View。
- CentOS7 64位下MySQL5.7安装与配置(YUM)
- 群晖ds216j如何安装迅雷软件
- Array和Arraylist的应用辨析
- java抽象类
- [Paper阅读] TencentRec: 实时流推荐实践(一)
- Hibernate-Oracle注解视图(view)