註釋轉換 ——C++註釋轉換爲標準C語言註釋

具體要求:

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;

	}
}








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章