注释转换
注释转换 》 就是将代码中的注释转换为同一类的 , 比如是 C 语言 或者C++
C语言中 ,编译器默认的注释风格是 /* .........*/
C++中 ,编译器默认的注释风格是 // ....... 注释一行
要将 注释转化为
一致
这是一个很大的工程 ,因为你要将 其中的坑都要 考虑全面 。情况所有的j问题
都要解决。
否则 ,得到的代码会是 很乱 的。
下面是我自己画的 不同注释的转换关系 》》》
下面是
常见的一些C语言注释
// 1.一般情况
/* 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.连续注释问题
/**//**/
// 6.连续的**/问题
/***/
// 7.C++注释问题
// /*xxxxxxxxxxxx*/
要想做到 ,就要做到精益求精 ,将所有情况都考虑好 。
我已经做到了 ,相信 你也不例外

代码附录
~~~~~~~~~~~头文件 .h~~~~~~~~~~~~~~~
#pragma once//表示头文件被调用一次
#include <stdio.h>
#include <stdlib.h>
enum STATE //定义一个枚举类型 表示 此时代码的状态
{
NUL,//无注释状态
C,//C语言注释状态
CPP,//C++注释状态
END//代码结束状态
};
//执行转换函数
void CommentConvert(FILE *pfin,FILE * pfout);//pfin 表示的是要读取的文件 ,pfout表示转换后输出的文件
//无状态转换
void DoNULConvert(FILE *pfin,FILE * pfout,enum STATE * state);
//c状态转换
void DoCConvert(FILE *pfin,FILE * pfout,enum STATE * state);
//c++状态转换
void DoCPPConvert(FILE *pfin,FILE * pfout,enum STATE * state);
~~~~~~~~~~源文件 .c~~~~~~~~~~~~
#define _CRT_SECURE_NO_WARNINGS
#include "CommentConvert.h"
//执行转换函数
void CommentConvert(FILE *pfin,FILE * pfout)
{
enum STATE state = NUL;//初始化状态 为 无注释状态
while(state != END)//代码结束时跳出循环
{
switch(state)
{
case NUL://状态为无注释状态
{
DoNULConvert(pfin,pfout,&state);
}
break;
case C://状态为C注释状态
{
DoCConvert(pfin,pfout,&state);
}
break;
case CPP://状态为C++注释状态
{
DoCPPConvert(pfin,pfout,&state);
}
break;
default:
break;
}
}
}
//无状态转换
void DoNULConvert(FILE *pfin,FILE * pfout,enum STATE * state)
{
int start = 0;
int next = 0;
start = fgetc(pfin);//从文件中读取一个字符 来判断
switch( start)
{
case '/'://表示要进入注释状态
{
next = fgetc(pfin);//再从文件中读取一个字符 判断
switch(next)
{
case '*'://表示代码是 /* 表示进入C语言注释状态
{
fputc('/',pfout);//j将它改为C++注释 输出到文件
fputc('/',pfout);
*state = C;//状态转换为 C注释状态
}
break;
case '/'://表示代码是 // 表示进入C++注释状态
{
fputc(start,pfout);//将注释输出到文件
fputc(next,pfout);
*state = CPP; //状态转换为 C++注释状态
}
break;
default: //表示这个'/ '是字符
{
fputc(start,pfout); //将读取到的字符输出到文件
fputc(next,pfout);
}
break;
}
}
break;
case EOF://遇到EOF表示代码结束
{
fputc(start,pfout);//将EOF输到文件
*state = END;//状态改为 END
}
break;
default://表示遇到的不是注释 ,状态不变
{
fputc(start,pfout); //将读取的字符输出到文件
}
break ;
}
}
//c状态转换
void DoCConvert(FILE *pfin,FILE * pfout,enum STATE * state)
{
int start = 0;
int next = 0;
int then = 0;
start = fgetc(pfin);//从文件中读取一个字符 来判断
switch(start)//c注释状态 不会直接转换为END状态
{
case '*'://遇到'*'表示C语言注释状态 可能会结束
{
next = fgetc(pfin); //再重新 读取 一个字符
switch(next)//判断
{
case '/'://表示 C语言注释 结束 但要判断之后是不是'\n',因为C++注释是以换行结束的
{
then =fgetc(pfin);//再重新 读取 一个字符
if(then == '\n')//如果是'\n'
{
fputc(then,pfout);//输出
}
else
{
fputc('\n',pfout);//如果不是 ,我们要帮他换行
ungetc(then,pfin);//并且要将用来判断的字符 从读取流中的撤销 ,防止下次判断时 少判断一个字符
}
*state = NUL;//状态装换为无注释状态
}
break;
default :
{
fputc(start,pfout);
ungetc(next,pfin);//将多余用来判断的字符撤销
}
break;
}
}
break;
case '\n'://换行之后要加上 // 因为C++只注释能一行
{
fputc(start,pfout);
fputc('/',pfout);
fputc('/',pfout);
}
break;
default:
fputc(start,pfout); //否则直接输出
break;
}
}
//c++状态转换
void DoCPPConvert(FILE *pfin,FILE * pfout,enum STATE * state)
{
int start = 0;
int next = 0;
int then = 0;
start = fgetc(pfin);//从文件中读取一个字符 来判断
switch(start)
{
case '\n' ://表示 C++一行注释结束
{
fputc(start,pfout);
*state = NUL;//状态改为无注释状态
}
break;
default :
fputc(start,pfout);
break;
}
}
如果要是不明白 ungetc 函数 可以 点击看看 I/O系列函数
~~~~~~~~~~~~~~~~测试代码 test.c~~~~~~~~~~~~~~
#define _CRT_SECURE_NO_WARNINGS
#include "CommentConvert.h"//定义的头文件
int main()
{
FILE *pfin = NULL;//定义两文件指针
FILE *pfout= NULL;
pfin = fopen("input.c","r");//打开 读取 的文件
if(pfin == NULL )
{
perror("input file open:");//读取失败
exit(EXIT_FAILURE);
}
pfout = fopen("output.c","w");//打开 要写入 的文件
if(pfout ==NULL)
{
perror("output file open:");//读取失败
fclose(pfin);//要将读文件关闭取的
exit(EXIT_FAILURE);
}
CommentConvert(pfin,pfout);
printf("转换成功\n");
fclose(pfin);//关闭两文件
fclose(pfout);
system("pause");
return 0 ;
}<strong>
</strong>
函数写的我好累 啊, 下午写一下 转化为 C语言注释的代码 有兴趣的 c++注释转为C注释
可以看看