C语言实现C到C++的注释转换
2015-12-17 14:47
453 查看
C语言中的注释一般为/*......*/来标注,C++的注释一般为//来标注,为了完成注释的转换,我考虑了一下几种情:
1.一般情况
/* int i = 0; */
这是最通常的情况,当遇到/*时把其替换成//,遇到*/时直接跳过
2.换行问题
/* int i = 0; */int j = 0;
/* int i = 0; */
int j = 0;
如果存在换行,或者C语言中的注释没有换行,我们就要考虑,若注释后面有换行符,直接打印,若无,则加上换行符,再打印后面的内容
3.匹配问题
/*int i = 0;/*xxxxx*/
若注释内容存在/*,我们必须打印出来,为此,我定义了一个枚举变量State,用来判断内容是否存在注释内,便可以很好的解决
4.多行注释问题
/*
int i=0;
int j = 0;
int k = 0;
*/int k = 0;
如若内容存在注释内且有换行,那么一个//是不够把它都注释掉的,所以在内容内的换行之前,可以加上//
5.连续注释问题
/**//**/
解决完以上问题,因为我已经连续读取了3个字符,所以遇到连续注释的情况,只能转换第一个注释,并不能转换第二个注释,所以用fseek函数,将读取内容退回文件,防止出现纰漏。
6.连续的**/问题
/***/
这个问题与上一条类似,只是把第二个读取的字符退回就好了。
7.C++注释问题
// /*xxxxxxxxxxxx*/
如果这让,则单独判断是否注释前有C++注释,若有,则换行在转换C的注释,这样做比直接取消掉C的注释要好很多,如果//写有内容 /*xxxxxxxxxxxx*/,也可以让层次分得清楚。
代码如下:
如有什么不足之处,希望批评指正。
1.一般情况
/* int i = 0; */
这是最通常的情况,当遇到/*时把其替换成//,遇到*/时直接跳过
2.换行问题
/* int i = 0; */int j = 0;
/* int i = 0; */
int j = 0;
如果存在换行,或者C语言中的注释没有换行,我们就要考虑,若注释后面有换行符,直接打印,若无,则加上换行符,再打印后面的内容
3.匹配问题
/*int i = 0;/*xxxxx*/
若注释内容存在/*,我们必须打印出来,为此,我定义了一个枚举变量State,用来判断内容是否存在注释内,便可以很好的解决
4.多行注释问题
/*
int i=0;
int j = 0;
int k = 0;
*/int k = 0;
如若内容存在注释内且有换行,那么一个//是不够把它都注释掉的,所以在内容内的换行之前,可以加上//
5.连续注释问题
/**//**/
解决完以上问题,因为我已经连续读取了3个字符,所以遇到连续注释的情况,只能转换第一个注释,并不能转换第二个注释,所以用fseek函数,将读取内容退回文件,防止出现纰漏。
6.连续的**/问题
/***/
这个问题与上一条类似,只是把第二个读取的字符退回就好了。
7.C++注释问题
// /*xxxxxxxxxxxx*/
如果这让,则单独判断是否注释前有C++注释,若有,则换行在转换C的注释,这样做比直接取消掉C的注释要好很多,如果//写有内容 /*xxxxxxxxxxxx*/,也可以让层次分得清楚。
代码如下:
#include <stdio.h> #include <errno.h> #include <assert.h> typedef enum Con_State { Con_SUCCESS, Con_FAIL }Con_State; typedef enum State { C_BEGIN, C_END }State; Con_State Convert(FILE*fout, FILE*fin) { int flag = C_END;//匹配问题 char first=0; char second=0; char next = 0; assert(fout); assert(fin); while ((first = fgetc(fout)) != EOF) { switch (first) { case '/': second = fgetc(fout); if ((second == '*')&&flag==C_END) { flag = C_BEGIN; fputc('/', fin); fputc('/', fin); } else if (second == '/')//C++注释问题 { fputc(first, fin); fputc(second, fin); fputc('\n', fin); } else { fputc(first, fin); fputc(second, fin); } break; case '\n'://多行注释问题 if (flag == C_BEGIN) { fputc(first, fin); fputc('/', fin); fputc('/', fin); } else { fputc(first, fin); } break; case '*': second = fgetc(fout); if ((second == '/')&&(flag==C_BEGIN)) { flag = C_END; if (((next = fgetc(fout)) != '\n')&&(next!=EOF))//换行问题,连续注释问题 { fputc('\n', fin); } fseek(fout, -1, SEEK_CUR);//连续的** / 问题 } else { fputc(first, fin); fseek(fout, -1, SEEK_CUR);//连续的** / 问题 } break; default: fputc(first, fin); break; } } return Con_SUCCESS; } Con_State annotaCon() { FILE* fout; FILE* fin; int ret = 0; fout = fopen("output.c", "r"); if (fout == NULL) { printf("打开%s失败error:%d\n", "output", errno); return Con_FAIL; } fin = fopen("input.c", "w"); if (fin == NULL) { printf("打开%s失败error:%d\n", "input", errno); fclose(fout); return Con_FAIL; } ret=Convert(fout, fin); fclose(fout); fclose(fin); return ret; }
如有什么不足之处,希望批评指正。
相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- 如何写好 C main 函数
- Lua和C语言的交互详解
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- C语言编程中统计输入的行数以及单词个数的方法
- C语言自动生成enum值和名字映射代码
- 使用C语言判断英文字符大小写的方法
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总
- C语言中计算正弦的相关函数总结
- 使用C语言详解霍夫曼树数据结构
- 探讨C语言的那些小秘密之断言
- C语言实现BMP转换JPG的方法
- 深入探讨C语言中局部变量与全局变量在内存中的存放位置
- C语言查找数组里数字重复次数的方法