具體要求:
1:C++風格的註釋//註釋轉換爲標準C分風格/* */註釋
2:/* */風格的註釋保持原樣
3:所有的轉換需要符合語法規則
4:註釋轉換需要支持註釋嵌套
轉換要求:
註釋的嵌套情形很多,這裏只是舉例,你需要遵照C/C++語言的註釋規則來編寫代碼,我不會僅測試這裏的例子。
1、單行註釋或沒有嵌套,註釋行直接轉換,如:
①//123 /* 123 */
②/* 123 */ /* 123 */ 不變
③/*123
*/ 保持原樣
2、有嵌套的註釋(一個註釋中還有嵌套其他註釋符號//,/* */)嵌套中多餘的每個註釋符號用兩個空格代替。
如單行:
① //123 /*456 */ /*123 456*/
②//123//456 /*123 456*/
③//123*//*456 /*123 456*/
如跨行
/*…….. /*……..
//……… ……….
// …….. ……….
*/ */
注意事項:
1、除以下兩種情況的修改,源文件轉換後不能有任何其它的修改:
①多餘的註釋符用空格代替
②//在註釋開始替換爲/* ,行尾增加*/
2、下面的3種情形無需轉換
① /* 123 */ /* 456 */
②/* 123 */ /* 456
*/
③/* 123
*/ /* 456
*/
3、不需要考慮輸入文件中不符合語法規則的註釋
主函數代碼塊:
#include<iostream>
using namespace std;
extern int CommentConvert(FILE *inputfile, FILE *outputfile);
int main()
{
FILE *fpIn = NULL; //inputfile
FILE *fpOut = NULL; //outputfile
fpIn = fopen("input.c","r");
if(NULL == fpIn)
{
cout<<"Open input file fail!"<<endl;
return -1;
}
fpOut = fopen("output.c","w");
if(NULL == fpOut)
{
cout<<"Open output file fail!"<<endl;
return -1;
}
CommentConvert(fpIn,fpOut); //
fclose(fpIn);
fclose(fpOut);
return 0;
}
實現具體功能函數:
#include<iostream>
using namespace std;
extern int CommentConvert(FILE *inputfile, FILE *outputfile);
typedef enum
{
NO_COMMENT_STATE,
C_COMMENT_STATE,
CPP_COMMENT_STATE,
STR_STATE,
END_STATE
}STATE_ENUM;
typedef struct
{
FILE *inputfile;
FILE *outputfile;
STATE_ENUM ulstate;
}STATE_MACHINE;
STATE_MACHINE g_state = {0};
///////////////////////////////////////////////////
void EventPro(char ch);
void EventProAtNo(char ch);
void EventProAtC(char ch);
void EventProAtCpp(char ch);
void EventProAtStr(char ch);
////////////////////////////////////////////////////
int CommentConvert(FILE *inputfile, FILE *outputfile)
{
if(inputfile==NULL || outputfile==NULL)
{
cout<<"input argument 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 STR_STATE:
EventProAtStr(ch);
break;
case END_STATE:
break;
}
}
void EventProAtNo(char ch)
{
char nextch;
switch(ch)
{
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
{
}
break;
case EOF:
g_state.ulstate = END_STATE;
break;
default:
fputc(ch,g_state.outputfile);
break;
}
}
void EventProAtC(char ch)
{
char nextch;
switch(ch)
{
case '/':// 嵌套處理
nextch = fgetc(g_state.inputfile);
if(nextch == '/')// /* hjhj//hhh
{
fputc(' ',g_state.outputfile);
fputc(' ',g_state.outputfile);
}
else if(nextch == '*') // /*hhjhh/*
{
fputc(' ',g_state.outputfile);
fputc(' ',g_state.outputfile);
}
else
{
fputc(ch,g_state.outputfile);
}
break;
case '*':
nextch = fgetc(g_state.inputfile);
if(nextch == '/')
{
fputc(ch,g_state.outputfile);
fputc(nextch,g_state.outputfile);
g_state.ulstate = NO_COMMENT_STATE;
}
break;
case '"':
g_state.ulstate =STR_STATE;
break;
default:
fputc(ch,g_state.outputfile);
break;
}
}
void EventProAtCpp(char ch)
{
//123 /*123
char nextch;
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('\n',g_state.outputfile);
g_state.ulstate = NO_COMMENT_STATE;
break;
case '/':// 嵌套處理
nextch = fgetc(g_state.inputfile);
if(nextch == '/')// // hjhj//hhh
{
fputc(' ',g_state.outputfile);
fputc(' ',g_state.outputfile);
}
else if(nextch == '*') // //hhjhh/*
{
fputc(' ',g_state.outputfile);
fputc(' ',g_state.outputfile);
}
else
{
fputc(ch,g_state.outputfile);
}
break;
case '*':
nextch = fgetc(g_state.inputfile);
if(nextch == '/')// // asas*/
{
fputc(' ',g_state.outputfile);
fputc(' ',g_state.outputfile);
}
else
{
fputc(ch,g_state.outputfile);
}
break;
case '"':
g_state.ulstate =STR_STATE;
break;
default:
fputc(ch,g_state.outputfile);
break;
}
}
void EventProAtStr(char ch)
{
char nextch;
switch(ch)
{
case '\0':
nextch = fgetc(g_state.inputfile);
if(nextch == '"')
{
g_state.ulstate = NO_COMMENT_STATE;
}
break;
case EOF:
g_state.ulstate = END_STATE;
break;
default:
fputc(ch,g_state.outputfile);
break;
}
}