C註釋風格轉化爲C++風格註釋

C轉C++可能遇到的問題:ide

//1.通常狀況函數

/* int i = 0; */url


// 2.換行問題spa

/* int i = 0; */ int j = 0;設計

/* int i = 0; */blog

int j = 0;v8


// 3.匹配問題get

/*int i = 0;/*xxxxx*/input


// 4.多行註釋問題it

/*

int i=0;

int j = 0;

int k = 0;

*/int k = 0;


// 5.連續註釋問題

/**//**/


// 6.連續的**/問題

/***/


// 7.C++註釋問題

// /*xxxxxxxxxxxx*/

咱們能夠發現註釋轉換須要考慮的狀況是很是多的,這對於咱們寫程序是很是不利的,爲解決這類問題,咱們引入有限狀態機的概念。

   有限狀態機簡稱狀態機,是表示有限個狀態以及在這些狀態之間轉移的行爲的 模型。有限狀態機是閉環系統,能夠用有限的狀態處理無窮的狀態。


一般咱們使用switch case語句來處理有限狀態機,

switch (state )

{

case 1:

// ...

break ;

case 2:

// ...

break ;

case 3:

// ...

break ;

.

.

case n :

break ;

default :

}


wKioL1bicE6zGNTpAACIr4V8eLE844.png

spacer.gif

主要代碼設計:

1,咱們要聲明一個枚舉(enum)類型來存放四種狀態

typedef   enum CONVERT_STATE

{

     NULL_STATE,

     C_STATE,

     CPP_STATE,

     END_STATE,

}StateType;

定義全局變量state,初始狀態爲NULL_STATE.

2,聲明一個打開input.c和output.c的函數

void CommentConvert()

{

                 FILE *pWrite=NULL ;         

                 FILE *pRead = fopen("input.c" , "r");

                 if (pRead == NULL )

                {

                                perror( "open file for read");

                                exit( EXIT_FAILURE);

                }

                pWrite = fopen( "output.c", "w" );

                 if (pWrite == NULL )

                {

                                fclose(pRead);

                                perror( "open file for write");

                                exit( EXIT_FAILURE);

                }

                ConvertWork(pRead, pWrite);

                fclose(pRead);

                fclose(pWrite);

}

3,聲明一個切換狀態的函數

void ConvertWork(FILE *pRead, FILE *pWrite )

{

                 state = NULL_STATE;


                 while (state != END_STATE)

                {

                                 switch (state)

                                {

                                 case NULL_STATE:

                                                DoNullState( pRead, pWrite );

                                                 break;

                                 case C_STATE:

                                                DoCState( pRead, pWrite );

                                                 break;

                                 case CPP_STATE:

                                                DoCppState( pRead, pWrite );

                                                 break;

                                }

                }

}

4,咱們還要聲明處理不一樣狀態的函數

處理NULL_STATE的函數:

void DoNullState(FILE *read, FILE *write)

{

                 int first = fgetc(read );

                 int second = 0;

                 switch (first)

                {

                                 case '/' :

                                                second = fgetc(read);

                                                 if (second == '*' )

                                                {

                                                                fputc(first, write);

                                                                fputc( '/', write );

                                                                state = C_STATE;

                                                }

                                                 else if (second == '/')

                                                {

                                                                fputc(first, write);

                                                                fputc( '/', write );

                                                                state = CPP_STATE;

                                                }

                                                 else

                                                {

                                                                fputc(first, write);

                                                                fputc(second, write);

                                                }

                                    break;

                                 case EOF :

                                                fputc(first, write);

                                                state = END_STATE;

                                                 break;

                    default:

                                                fputc(first, write);

                                                 break;

                }

}

處理C_STATE的的函數:

void DoCState(FILE *read, FILE *write)

{

                 int first = fgetc(read );

                 int second = 0;

                 switch (first)

                {

                 case '/' :

                                second = fgetc( read);

                                 if (second == '*' )

                                {

                                }

                                 else if (second == '/')

                                {

                                }

                                 else

                                {

                                                fputc(first, write);

                                                fputc(second, write);

                                }

                                 break;

                 case '\n' :

                                fputc( '\n', write );

                                fputc( '/',write );

                                fputc( '/', write );

                                 break;

                 case '*' :

                                second = fgetc( read);

                                 if (second == '*' )

                                {

                                                fputc(first, write);

                                                first=fgetc( read);

                                                 if (first == '/' )

                                                {

                                                                fputc( '\n', write );

                                                                state = NULL_STATE;

                                                }

                                }

                                 else if (second == '/')

                                {

                                                fputc( '\n', write );

                                                state = NULL_STATE;

                                }

                                 else

                                {

                                                fputc(first, write);

                                                fputc(second, write);

                                }

                                 break;

                 case EOF :

                                                fputc(first, write);

                                                state = END_STATE;

                                                 break;

                 default:

                                                fputc(first, write);

                                                 break;

                }

}

處理CPP_STATE的函數:

void DoCppState(FILE *read, FILE *write)

{

                 int first = fgetc(read );

                 int second = 0;

                                 switch (first)

                                {

                                 case '/' :

                                                second = fgetc(read);

                                                 if (second == '*' )

                                                {

                                                }

                                                 else if (second == '/')

                                                {

                                                }

                                                 else

                                                {

                                                                fputc(first, write);

                                                                fputc(second, write);

                                                }

                                                 break;

                                 case '\n' :

                                                fputc(first, write);

                                                state = NULL_STATE;

                                                 break;

                                 case '*' :

                                                second = fgetc(read);

                                                 if (second == '/' )

                                                {

                                                }

                                                 else

                                                 if (second == '*' )

                                                {

                                                                fputc(first, write);

                                                }

                                                 break;

                    case EOF :

                                                 fputc(first, write);

                                                 state = END_STATE;

                                                 break;

                   default:

                                                  fputc(first, write);

                                                  break;

                                }

}

如圖:input.c

spacer.gifwKiom1bib-vyu3fZAAEzUM6yyfk542.png



運行程序後打開output.c:

wKioL1bicJ-Rv80bAAEuz1i-260727.png


spacer.gif

相關文章
相關標籤/搜索