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 :
}
主要代碼設計:
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
運行程序後打開output.c: