这是初学时写的一个小的项目,当时代码弄丢了,今天找回来了,发出来
代码是老早就写了最开始,没有经过更进一步的改进,仍然存在很多问题,但是对于一般的来说都是可以进行转换的
首先是为什么要进行注释转换,大家都知道在C和C++中注释方式是不相同的,有时候需要将一些代码进行排版统一。
而有时候一个项目代码的量实在太大,手工改有点不现实,这种情况下注释转换的作用就体现了出来。
我们以下部分注释为例进行测试
//每个区由若干个内存块组成
//每个区由若干个内存块组成,//每个块是4096个字节
//int i = 0;*/
//*//*int i = 0;
// /**/int i = 0;
/* int i = 0;
*//*
*/
*//*
*/
/* int i = 0;
//*/int j = 0;
//*/int j = 0;
/*
//每个区由若干个内存块组成,每个块是4096个字节
//每个块的第0个整数指向下个区
//所以是单链表结构
//所以每个区只有4092个字节存放真正的数据
*/
//每个区由若干个内存块组成,每个块是4096个字节
//每个块的第0个整数指向下个区
//所以是单链表结构
//所以每个区只有4092个字节存放真正的数据
*/
/* int i = 0;*//*int j = 0;
*/
*/
/*
*//*
*/int i =0;
*//*
*/int i =0;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 5
"abcdefghijklmn~~~~!!!!!!!!"
/////////////xyz
/////////////6/2=3
char *str = "hello //comment convert.";
//char *str = "hello //comment convert.";
/*char *str = "hello //comment convert.";*/
/*char *str = "hello //comment convert.;*/
char *str1 = "hello /* comment */ convert.";
char *str = "abc\"syz";
//char *str = "abc\"syz";
/*abc**/
//abc"xy//z"
//abc"xy*/z"
代码主函数部分
#include<iostream>
using namespace std;
extern "C" int ConvertComment(FILE *inputfile, FILE *outputfile);
int main()
{
FILE *fpIn = fopen("input.c", "r");
if(fpIn == NULL)
{
cout<<"Open input.c file Fail."<<endl;
return -1;
}
FILE *fpOut = fopen("output.c", "w");
if(fpOut == NULL)
{
cout<<"Open output.c file Fail."<<endl;
return -1;
}
ConvertComment(fpIn, fpOut); //
fclose(fpIn);
fclose(fpOut);
return 0;
}
可以看到代码的功能是将input.c里面的如上注释转换为C的注释
实现部分
#include<iostream>
using namespace std;
extern "C" int ConvertComment(FILE *inputfile, FILE *outputfile);
typedef unsigned long ulong;
//定义状态
typedef enum
{
NO_COMMENT_STATE, //无注释状态
C_COMMENT_STATE, //C注释状态
CPP_COMMENT_STATE,//C++注释状态
//CSTR_COMMENT_STATE,
//CPPSTR_COMMENT_STATE,
END_STATE
}ENUM_STATE;
//定义状态机
typedef struct
{
FILE *inputfile;
FILE *outputfile;
ENUM_STATE ulstate;
}state_machine;
//////////////////////////////////////////////////////
state_machine g_state;
void EventPro(char ch);
void EventProAtNo(char ch);
void EventProAtC(char ch);
void EventProAtCpp(char ch);
//void EventProAtCStr(char ch); //碰到字符串时的状况,有些问题先屏蔽掉
//void EventProAtCPPStr(char ch);//同上
//////////////////////////////////////////////////////
int ConvertComment(FILE *inputfile, FILE *outputfile)
{
if(inputfile==NULL || outputfile==NULL)
{
cout<<"Input Argument is Invalid."<<endl;
return -1;
}
/////////////////////////////////////////////////////////
g_state.inputfile = inputfile;
g_state.outputfile = outputfile;
g_state.ulstate = NO_COMMENT_STATE;
char ch;
while(g_state.ulstate != END_STATE)
{
ch = fgetc(g_state.inputfile);
EventPro(ch);
}
return 0;
}
void EventPro(char ch)
{
switch(g_state.ulstate)
{
case NO_COMMENT_STATE:
EventProAtNo(ch);
break;
case C_COMMENT_STATE:
EventProAtC(ch);
break;
case CPP_COMMENT_STATE:
EventProAtCpp(ch);
break;
/*case CSTR_COMMENT_STATE:
EventProAtCStr(ch);
break;
case CPPSTR_COMMENT_STATE:
EventProAtCPPStr(ch);
break;*/
default:
break;
}
}
void EventProAtNo(char ch)//无注释状态下进行操作
{
char nextch;
switch(ch)
{
case EOF:
g_state.ulstate = END_STATE;
case '/':
nextch = fgetc(g_state.inputfile);
if(nextch == '/') //C++
{
fputc('/', g_state.outputfile);
fputc('*', g_state.outputfile);
g_state.ulstate = CPP_COMMENT_STATE;
}
else if(nextch == '*') //C
{
fputc(ch, g_state.outputfile);
fputc(nextch, g_state.outputfile);
g_state.ulstate = C_COMMENT_STATE;
}
else
{
fputc(ch, g_state.outputfile);
fputc(nextch, g_state.outputfile);
}
break;
/*case '"':
fputc(ch, g_state.outputfile);
g_state.ulstate = CPPSTR_COMMENT_STATE;
break;*/
default:
fputc(ch, g_state.outputfile);
break;
}
}
/*void EventProAtCStr(char ch)
{
switch(ch)
{
case '"':
fputc(ch, g_state.outputfile);
g_state.ulstate = NO_COMMENT_STATE;
break;
case EOF:
g_state.ulstate = END_STATE;
break;
default:
fputc(ch,g_state.outputfile);
break;
}
}*/
/*void EventProAtCPPStr(char ch)
{
switch(ch)
{
case '"':
fputc(ch, g_state.outputfile);
g_state.ulstate = NO_COMMENT_STATE;
break;
case EOF:
g_state.ulstate = END_STATE;
break;
case '\n':
fputc('*',g_state.outputfile);
fputc('/',g_state.outputfile);
fputc(ch, g_state.outputfile);
g_state.ulstate = NO_COMMENT_STATE;
default:
fputc(ch,g_state.outputfile);
break;
}
}*/
void EventProAtC(char ch)
{
char nextch;
char thrch;
switch(ch)
{
case EOF:
fputc('*', g_state.outputfile);
fputc('/', g_state.outputfile);
g_state.ulstate = END_STATE;
break;
case '/':
nextch = fgetc(g_state.inputfile);
if(nextch == '/' || nextch == '*')
{
fputc(' ', g_state.outputfile);
fputc(' ', g_state.outputfile);
}
else
{
fputc(ch, g_state.outputfile);
}
break;
case '*':
nextch = fgetc(g_state.inputfile);
thrch = fgetc(g_state.inputfile);
if(nextch == '*')
{
if(thrch == '/')
{
fputc(' ', g_state.outputfile);
fseek(g_state.inputfile,-2,1);
}
else
{
fputc(ch, g_state.outputfile);
fputc(nextch, g_state.outputfile);
fseek(g_state.inputfile,-1,1);
}
}
else if(nextch == '/')
{
fputc('*', g_state.outputfile);
fputc('/', g_state.outputfile);
fseek(g_state.inputfile,-1,1);
g_state.ulstate = NO_COMMENT_STATE;
}
else
{
fputc(ch, g_state.outputfile);
fputc(nextch, g_state.outputfile);
fputc(thrch, g_state.outputfile);
}
break;
case '"':
switch(ch)
{
case '"':
g_state.ulstate = NO_COMMENT_STATE;
break;
case EOF:
g_state.ulstate = END_STATE;
break;
default:
fputc(ch,g_state.outputfile);
break;
}
default:
fputc(ch, g_state.outputfile);
break;
}
}
void EventProAtCpp(char ch)
{
char nextch;
char thrch;
switch(ch)
{
case EOF:
fputc('*', g_state.outputfile);
fputc('/', g_state.outputfile);
g_state.ulstate = END_STATE;
break;
case '\n':
fputc('*',g_state.outputfile);
fputc('/',g_state.outputfile);
fputc(ch, g_state.outputfile);
g_state.ulstate = NO_COMMENT_STATE;
break;
case '/':
nextch = fgetc(g_state.inputfile);
thrch = fgetc(g_state.inputfile);
if(nextch == '/')
{
if(thrch == '/')
{
fputc(' ', g_state.outputfile);
fseek(g_state.inputfile,-2,1);
}
else
{
fputc(' ', g_state.outputfile);
fputc(' ', g_state.outputfile);
fseek(g_state.inputfile,-1,1);
}
}
else if(nextch == '*')
{
fputc(' ', g_state.outputfile);
fputc(' ', g_state.outputfile);
fseek(g_state.inputfile,-1,1);
}
else
{
fputc(ch, g_state.outputfile);
fputc(nextch, g_state.outputfile);
fputc(thrch, g_state.outputfile);
}
break;
case '*':
nextch = fgetc(g_state.inputfile);
if(nextch == '/')
{
fputc(' ', g_state.outputfile);
fputc(' ', g_state.outputfile);
}
else
{
fputc(ch, g_state.outputfile);
fputc(nextch,g_state.outputfile);
}
break;
case '"':
switch(ch)
{
case '"':
g_state.ulstate = NO_COMMENT_STATE;
break;
case EOF:
g_state.ulstate = END_STATE;
break;
case '\n':
fputc('*',g_state.outputfile);
fputc('/',g_state.outputfile);
fputc(ch, g_state.outputfile);
g_state.ulstate = NO_COMMENT_STATE;
default:
fputc(ch,g_state.outputfile);
break;
}
default:
fputc(ch, g_state.outputfile);
break;
}
}
/*
int ConvertComment(FILE *inputfile, FILE *outputfile)
{
if(inputfile==NULL || outputfile==NULL)
{
cout<<"Input Argument is Invalid."<<endl;
return -1;
}
/////////////////////////////////////////////////////////
char ch, nextch;
ch = fgetc(inputfile);
while(ch != EOF)
{
if(ch == '/')
{
nextch = fgetc(inputfile);
if(nextch == '/') //C++ Comment
{
fputc('/', outputfile);
fputc('*', outputfile);
}
else if(nextch == '*') // C Comment
{}
else
{}
}
else
{
fputc(ch, outputfile);
}
ch = fgetc(inputfile);
}
fputc('*', outputfile);
fputc('/', outputfile);
return 0;
}
*/
由于代码是最开始写的一版 没有进行改进 所以关于碰到字符串的部分我屏蔽掉了,那部分是有一些问题的。后来我对代码也进行了一些改进下次发出来。
针对如上的测试文档运行结果
/*每个区由若干个内存块组成*/
/*每个区由若干个内存块组成, 每个块是4096个字节*/
/*int i = 0; */
/* int i = 0;*/
/* int i = 0; */
/* int i = 0;
*//*
*/
*//*
*/
/* int i = 0;
*/int j = 0;
*/int j = 0;
/*
每个区由若干个内存块组成,每个块是4096个字节
每个块的第0个整数指向下个区
所以是单链表结构
所以每个区只有4092个字节存放真正的数据
*/
每个区由若干个内存块组成,每个块是4096个字节
每个块的第0个整数指向下个区
所以是单链表结构
所以每个区只有4092个字节存放真正的数据
*/
/* int i = 0;*//*int j = 0;
*/
*/
/*
*//*
*/int i =0;
*//*
*/int i =0;
/* 5*/
"abcdefghijklmn~~~~!!!!!!!!"
/* xyz*/
/* 6/2=3*/
char *str = "hello /*comment convert.";
/*char *str = "hello /*comment convert.";
/*char *str = "hello /*comment convert.";*/
/*char *str = "hello /*comment convert.; */
char *str1 = "hello /* comment */ convert.";
char *str = "abc\"syz";
/*char *str = "abc\"syz";
/*abc */
/*abc"xy/*z"
/*abc"xy*/z"
可以看到在后面碰到有字符串的部分,是没有办法进行注释转换的。这个问题很好解决,下次发出来改进后的代码
ps:再次吐槽csdn的编辑器,就不能改进一下?QAQ