写过很多代码,但也是苦于低头苦干,代码的风格和能里还是需要迫切需要提高,所以在老师的提醒下学着写写博客,还希望高手们不吝赐教
一些封装还没来得及做,只是啰里啰嗦的把程序代码写完
//主函数
#include<iostream>
using namespace std;
extern "C" int ConvertComment(FILE *inputfile, FILE *outputfile);
int main(int argc, char *argv[])
{
FILE *fpIn = NULL;
FILE *fpOut = NULL;
fpIn = fopen("input.c", "r");
if(fpIn == NULL)
{
cout<<"Open input.c file Fail."<<endl;
return -1;
}
fpOut = fopen("output.c","w");
if(fpOut == NULL)
{
cout<<"Open output.c file Fail."<<endl;
return -1;
}
ConvertComment(fpIn, fpOut);
fclose(fpIn);
fclose(fpOut);
cout<<"注释转换完成......"<<endl;
}
/********************************************************************
在字符串里出现/* 或*-/前面没有/* (星杠)会被@@代替
存在的问题:
1、连串的/最后一个会保留
2、单独/ 和连续的 * 会保留
3、出现** / 无法改变
*******************************************************************/
#include<iostream>
using namespace std;
extern "C" int ConvertComment(FILE *inputfile, FILE *outputfile);
//状态定义
typedef enum
{
NO_COMMENT_STATE,//无注释状态
C_COMMENT_STATE,//C语言状态
CPP_COMMENT_STATE,//c++状态
STRING_COMMENT_STATE,//字符串状态
END_STATE//结束状态
}ENUM_STATE;
typedef struct StateMachine
{
FILE *inputfile;
FILE *outputfile;
ENUM_STATE state;
}StateMachine;
StateMachine g_state;
int i = 0;//计数一行遇见的“个数
int n = 0;//计数一行遇见的'个数
///////不考虑程序人员语法错误时候开始转换
int j = 0;//计数/*的个数,直到遇到第一个*/的时候将其置零,中途遇到的所有// /* 都会被替换成空格
//申明各个函数
void EventPro(char ch);
void EventProAtNo(char ch);
void EventProAtC(char ch);
void EventProAtCpp(char ch);
void EventProAtString(char ch);
void _Count_Comment(char ch,char ch1);
/////////////////////////////////////////////////////
int ConvertComment(FILE *inputfile, FILE *outputfile)
{
if(inputfile==NULL || outputfile==NULL)
{
cout<<"argument is invalid."<<endl;
return -1;
}
//////////////////////////////////////////////////
//初始化结构体变量
g_state.inputfile = inputfile;//读文件操作
g_state.outputfile = outputfile;//写文件操作
g_state.state = NO_COMMENT_STATE;//初始状态
char ch;
while(g_state.state != END_STATE)
{
ch = fgetc(g_state.inputfile);
EventPro(ch);
}
return 0;
}
void EventPro(char ch)
{
switch(g_state.state)
{
case NO_COMMENT_STATE:
EventProAtNo(ch);
break;
case C_COMMENT_STATE:
EventProAtC(ch);
break;
case CPP_COMMENT_STATE:
EventProAtCpp(ch);
break;
case STRING_COMMENT_STATE:
EventProAtString(ch);
break;
}
}
void EventProAtNo(char ch)
{
char nextch;
switch(ch)
{
case 39:
++n;
fputc(ch,g_state.outputfile );
g_state.state = STRING_COMMENT_STATE;
break;
case '"':
++i;
fputc(ch,g_state.outputfile );
g_state.state = STRING_COMMENT_STATE;
break;
case EOF:
if(j!=0)
{
fputc('*',g_state.outputfile );
fputc('/',g_state.outputfile );
j=0;
}
g_state.state = END_STATE;
break;
case '/':
nextch = fgetc(g_state.inputfile);
if(nextch == '/'|| nextch == '*') // C++////////////////////
{
_Count_Comment(ch,nextch);
}
else
{
if(nextch=='"'||nextch==39)
{
if(nextch == '"')
++i;
else
++n;
g_state.state = STRING_COMMENT_STATE;
}
fputc(ch,g_state.outputfile );
fputc(nextch,g_state.outputfile );
}
break;
case '*':
nextch = fgetc(g_state.inputfile);
if(nextch == '/')
{
if(j==0)
{
fputc(' ',g_state.outputfile);
fputc(' ',g_state.outputfile);
}
else
{
fputc('*',g_state.outputfile);
fputc('/',g_state.outputfile);
j=0;
}
}
else
{
if(nextch=='"'||nextch==39)
{
if(nextch == '"')
++i;
else
++n;
g_state.state = STRING_COMMENT_STATE;
}
fputc(ch,g_state.outputfile);
fputc(nextch,g_state.outputfile);
}
break;
default :
fputc(ch,g_state.outputfile);
break;
}
}
void EventProAtC(char ch)
{
char nextch;
switch(ch)
{
case '/':
nextch = fgetc(g_state.inputfile);
if(nextch == '/'||nextch == '*')
{
_Count_Comment(ch,nextch);
}
else
{
fputc(ch,g_state.outputfile);
fputc(nextch,g_state.outputfile);
}
break;
case '*':
nextch = fgetc(g_state.inputfile);
if(nextch!='*'&&nextch!='/')
{
fputc(ch,g_state.outputfile );
fputc(nextch,g_state.outputfile );
}
if(nextch=='*'||nextch=='/')
{
if(nextch=='/')
{
fputc(ch,g_state.outputfile );
fputc('*',g_state.outputfile);
fputc('/',g_state.outputfile);
j=0;
g_state.state = NO_COMMENT_STATE;
}
else
{
fputc(ch,g_state.outputfile);
ch=nextch;
EventProAtC(ch);
}
}
//fputc(nextch,g_state.inputfile);
/*
nextch = fgetc(g_state.inputfile);
if(nextch == '/')
{
if(j==0)
{
fputc(' ',g_state.outputfile);
fputc(' ',g_state.outputfile);
}
else
{
fputc('*',g_state.outputfile);
fputc('/',g_state.outputfile);
j=0;
g_state.state = NO_COMMENT_STATE;
}
}
else if(nextch=='*')
{
fputc(ch,g_state.outputfile);
char nextch1=fgetc(g_state.inputfile );
if(nextch1=='/')
j=0;
fputc(nextch,g_state.outputfile);
fputc(nextch1,g_state.outputfile );
}
else
{
fputc(ch,g_state.outputfile);
fputc(nextch,g_state.outputfile);
}*/
break;
case EOF:
if(j==1)
{
fputc('*',g_state.outputfile);
fputc('/',g_state.outputfile);
j=0;
}
g_state.state = END_STATE;
break;
default:
fputc(ch,g_state.outputfile);
break;
}
}
void EventProAtCpp(char ch)
{
char nextch;
switch(ch)
{
case '\n':
if(j!=0)
{
fputc('*',g_state.outputfile );
fputc('/',g_state.outputfile );
j=0;
g_state.state = NO_COMMENT_STATE;
}
fputc(ch,g_state.outputfile);
break;
case '/':
nextch = fgetc(g_state.inputfile);
if(nextch == '*'||nextch=='/')
{
_Count_Comment(ch,nextch);
}
else
{
if(nextch==39||nextch=='"')
{
if(nextch==39)
++n;
else
++i;
g_state.state =STRING_COMMENT_STATE;
}
fputc(ch,g_state.outputfile );
fputc(nextch,g_state.outputfile );
}
break;
case '*':
nextch = fgetc(g_state.inputfile);
if(nextch == '/')
{
fputc(' ',g_state.outputfile);
fputc(' ',g_state.outputfile);
}
break;
case '"':
++i;
fputc(ch,g_state.outputfile);
g_state.state = STRING_COMMENT_STATE;
break;
case 39:
++n;
fputc(ch,g_state.outputfile);
g_state.state = STRING_COMMENT_STATE;
break;
case EOF:
if(j!=0)
{
fputc('*',g_state.outputfile);
fputc('/',g_state.outputfile);
j=0;
}
g_state.state = END_STATE;
break;
default:
fputc(ch,g_state.outputfile);
break;
}
}
//字符串状态处理函数
void EventProAtString(char ch)//在这里不改变j的值
{
char nextch;
char nextch1;
switch(ch)
{
case '"':
++i;
fputc(ch,g_state.outputfile);
if(i%2==0)
{
nextch = fgetc(g_state.inputfile);
if(nextch=='/')
{
nextch1 = fgetc(g_state.inputfile);
if(nextch1 == '/'||'*')
{
_Count_Comment(nextch,nextch1);
}
else
{
if(nextch1==39||nextch1=='"')
{
if(nextch1==39)
++n;
else
++i;
}
else
g_state.state = NO_COMMENT_STATE;
fputc(nextch,g_state.outputfile);
fputc(nextch1,g_state.outputfile);
}
}
else if(nextch=='*')
{
nextch1 = fgetc(g_state.inputfile);
if(nextch1 == '/')
{
if(j!=0)
{
fputc(nextch,g_state.outputfile );
fputc(nextch1,g_state.outputfile );
j=0;
}
else
{
fputc(' ',g_state.outputfile );
fputc(' ',g_state.outputfile );
}
g_state.state = NO_COMMENT_STATE;
}
else
{
if(nextch1==39||nextch1=='"')
{
if(nextch1==39)
++n;
else
++i;
}
else
g_state.state = NO_COMMENT_STATE;
fputc(nextch,g_state.outputfile);
fputc(nextch1,g_state.outputfile);
}
}
else if(nextch == EOF)
{
if(j!=0)
{
fputc('*',g_state.outputfile );
fputc('/',g_state.outputfile );
j=0;
}
g_state.state = END_STATE;
}
else
{
fputc(nextch,g_state.outputfile );
if(nextch=='"'||nextch==39)
{
if(nextch == '"')
++i;
else
++n;
g_state.state = STRING_COMMENT_STATE;
}
else
g_state.state = NO_COMMENT_STATE;
}
}
break;
case 39:
++n;
fputc(ch,g_state.outputfile);
if(n%2==0)
{
nextch = fgetc(g_state.inputfile);
if(nextch=='/')
{
nextch1 = fgetc(g_state.inputfile);
if(nextch1 == '/'||'*')
{
_Count_Comment(nextch,nextch1);
}
else
{
fputc(nextch,g_state.outputfile );
fputc(nextch1,g_state.outputfile );
if(nextch1=='"'||nextch1==39)
{
if(nextch1 == '"')
++i;
else
++n;
g_state.state = STRING_COMMENT_STATE;
}
else
g_state.state = NO_COMMENT_STATE;
}
}
else if(nextch=='*')
{
nextch1 = fgetc(g_state.inputfile);
if(nextch1 == '/')
{
if(j!=0)
{
fputc(nextch,g_state.outputfile );
fputc(nextch1,g_state.outputfile );
j=0;
}
else
{
fputc(' ',g_state.outputfile );
fputc(' ',g_state.outputfile );
}
g_state.state = NO_COMMENT_STATE;
}
else
{
fputc(nextch,g_state.outputfile);
fputc(nextch1,g_state.outputfile);
if(nextch1=='"'||nextch1==39)
{
if(nextch1 == '"')
++i;
else
++n;
g_state.state = STRING_COMMENT_STATE;
}
else
g_state.state = NO_COMMENT_STATE;
}
}
else if(nextch=='\n')
{
if(j!=0)
{
fputc('*',g_state.outputfile);
fputc('/',g_state.outputfile);
j=0;
}
fputc(nextch,g_state.outputfile );
g_state.state = NO_COMMENT_STATE;
}
else if(nextch == EOF)
{
if(j!=0)
{
fputc('*',g_state.outputfile );
fputc('/',g_state.outputfile );
j=0;
}
g_state.state = END_STATE;
}
else
{
fputc(nextch,g_state.outputfile );
if(nextch=='"'||nextch==39)
{
if(nextch == '"')
++i;
else
++n;
g_state.state = STRING_COMMENT_STATE;
}
else
g_state.state = NO_COMMENT_STATE;
}
}
break;
case '\n':
fputc(ch,g_state.outputfile );
i=0;
n=0;
g_state.state = NO_COMMENT_STATE;
break;
default :
if(i%2==0&&i!=0||n%2==0&&n!=0)//防止嵌套的引号出现
{
if(ch=='*')
{
nextch = fgetc(g_state.inputfile);
if(nextch == '/'||j!=0)
{
fputc('@',g_state.outputfile );
fputc('@',g_state.outputfile );
}
else
{
if(nextch==39||nextch=='"')
{
if(nextch == 39)
++n;
else
++i;
}
fputc(ch,g_state.outputfile );
fputc(nextch,g_state.outputfile );
}
}
else
{
fputc(ch,g_state.outputfile);
g_state.state = NO_COMMENT_STATE;
}
}
else
if(ch == '*')
{
char nextch = fgetc(g_state.inputfile );
if(nextch == '/'&&j!=0)
{
fputc('@',g_state.outputfile );
fputc('@',g_state.outputfile );
}
else
{
fputc(ch,g_state.outputfile );
fputc(nextch,g_state.outputfile );
}
}
else
fputc(ch,g_state.outputfile);
break;
}
}
//内部使用函数,用于处理c和c++下面遇到的//和/*
void _Count_Comment(char ch1,char ch2)
{
switch(ch2)
{
case '/':
if(j == 0)
{
char nextch3 = fgetc(g_state.inputfile);
if(nextch3=='\n')
{
fputc(' ',g_state.outputfile);
fputc(' ',g_state.outputfile);
g_state.state = CPP_COMMENT_STATE;
}
else
{
fputc('/',g_state.outputfile);
fputc('*',g_state.outputfile);
++j;
g_state.state =CPP_COMMENT_STATE;
}
fputc(nextch3,g_state.outputfile);
}
else
{
fputc(' ',g_state.outputfile);
fputc(' ',g_state.outputfile);
}
break;
case '*':
if(j == 0)
{
fputc('/',g_state.outputfile);
fputc('*',g_state.outputfile);
++j;
g_state.state = C_COMMENT_STATE;
}
else
{
fputc(' ',g_state.outputfile);
fputc(' ',g_state.outputfile);
}
break;
}
}