C轉C++可能遇到的問題:
//1.一般情況
/* int i = 0; */
// 2.換行問題
/* int i = 0; */ int j = 0;
int j = 0;
// 3.比對問題
/*int i = 0;/*xxxxx*/
// 4.多行注釋問題
/*
int i=0;
int k = 0;
*/int k = 0;
// 5.連續注釋問題
/**//**/
// 6.連續的**/問題
/***/
// 7.C++注釋問題
// /*xxxxxxxxxxxx*/
我們可以發現注釋轉換需要考慮的情況是非常多的,這對于我們寫程式是非常不利的,為解決這類問題,我們引入有限狀态機的概念。
有限狀态機簡稱狀态機,是表示有限個狀态以及在這些狀态之間轉移的行為的 模型。有限狀态機是閉環系統,可以用有限的狀态處理無窮的狀态。
通常我們使用switch case語句來處理有限狀态機,
switch (state )
{
case 1:
// ...
break ;
case 2:
case 3:
.
case n :
default :
}
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuQDN4UETlhjV0IXSDFUQwRlTHpnNFNWaiFDTvl2S39CX1MzLcR0NvwFMw00LcJDMzZWe39CXt92Yu8GdjFTNuUzcvw1LcpDc0RHaiojIsJye.png)
主要代碼設計:
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");
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 );
case CPP_STATE:
DoCppState( pRead, pWrite );
}
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 == '/')
state = CPP_STATE;
else
fputc(second, write);
break;
case EOF :
fputc(first, write);
state = END_STATE;
default:
處理C_STATE的的函數:
void DoCState(FILE *read, FILE *write)
case '/' :
second = fgetc( read);
if (second == '*' )
else if (second == '/')
else
fputc(second, write);
break;
case '\n' :
fputc( '\n', write );
fputc( '/',write );
fputc( '/', write );
case '*' :
first=fgetc( read);
if (first == '/' )
fputc( '\n', write );
state = NULL_STATE;
fputc( '\n', write );
state = NULL_STATE;
case EOF :
default:
處理CPP_STATE的函數:
void DoCppState(FILE *read, FILE *write)
switch (first)
case '\n' :
case '*' :
if (second == '/' )
case EOF :
fputc(first, write);
state = END_STATE;
default:
fputc(first, write);
break;
如圖:input.c
運作程式後打開output.c: