此次的注释转换就是将C语言中的注是转换成c++的注释。
一、注释转换的基本思路
在注释转换中,将会遇到5种状态(普通状态、遇到\状态、C++注释状态、C注释状态、遇到*状态):
1.以普通状态(NORMAL)开始,如果遇到 / 将进入遇到/状态(FOUND_SLASH),否则将继续处于NORMAL状态 ;
2.进入 /状态(FOUNGD_SLASH)后,继续获取字符,如果遇到 *将进入C注释状态(C_COMMENT)、如果遇到 /将进入C++注释状态(CPP_COMMENT)、除这俩种以外将返回普通状态(NORMAL);
3.进入C注释状态(C_COMMENT)后,继续获取字符,如果遇到* 将进入遇到*状态(FOUND_STAR),否则继续保持C注释(C_COMMENT);
注:进入C注释后,将要判断是否遇到 \n,如果遇到,将输入\n和\\;
4.进入C++注释(CPP_COMMENT)后,继续获取字符,如果遇到遇到 \n将进入普通状态(NORMAL),否则继续保持C++注释状态(CPP_COMMENT)。
5.进入*状态(FOUND_STAR)后将继续进行获取字符,如果遇到*将继续处于*状态(FOUND_STAR),如果遇到 /将进入普通状态(NORMAL),除此之外,将返回C注释状态(C_COMMENT)。
注:进入*状态遇到/之后,还要判断下一个字符是否为/n,如果为/n,不做处理,反正输入\n.
在以上代码中,如果是试图查看下一个字符时,用完记得要进行归还。
二、注释转换思路图
三、注释转换模拟文件
//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++注释问题
// /*xxxxxxx
四、注释转换程序代码
#include<stdio.h>
#include<stdlib.h>
typedef enum State{
NORMAL, //普通状态
FOUND_SLASH, //遇到/状态
CPP_COMMENT, //c++注释状态
C_COMMENT, //c注释状态
FOUND_STAR, //遇到*状态
}State;
void CommentConvert(FILE* input,FILE* output){
State state = NORMAL;
char ch;
char next;
while(1){
ch = fgetc(input);
if(ch == EOF){
return;
}
switch(state){
case NORMAL:
if(ch == '/'){
fputc('/',output);
state = FOUND_SLASH;
}else{
fputc(ch,output);
state = NORMAL;
}
break;
case FOUND_SLASH:
if(ch == '*'){
fputc('/',output);
state = C_COMMENT;
}else if(ch == '/'){
fputc('/',output);
state = CPP_COMMENT;
}else{
fputc(ch,output);
state = NORMAL;
}
break;
case CPP_COMMENT:
if(ch == '\n'){
fputc('\n',output);
state = NORMAL;
}else{
fputc(ch,output);
state = CPP_COMMENT;
}
break;
case C_COMMENT:
if(ch == '*'){
state = FOUND_STAR;
}else if(ch == '\n'){
fputc('\n',output);
fputc('/',output);
fputc('/',output);
}else{
fputc(ch,output);
state = C_COMMENT;
}
break;
case FOUND_STAR:
if(ch == '*'){
fputc('*',output);
state = FOUND_STAR;
}else if(ch == '/'){
next = fgetc(input);
ungetc(next,input);
if(next != '\n'){
fputc('\n',output);
state = NORMAL;
}else{
state = NORMAL;
}
}else{
fputc('*',output);
fputc(ch,output);
state = C_COMMENT;
}
break;
}
}
}
int main(){
FILE* input = fopen("input.c","r");
FILE* output = fopen("output.c","w");
CommentConvert(input,output);
fclose(output);
fclose(input);
return 0;
}
五、程序输出结果
//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++注释问题
// /*xxxxxxx