之前写了一个同样功能的一段程序http://blog.programfan.com/article.asp?id=34327这次模仿别人的思路,我自己又重新写了一个用状态机实现的。相比之前我写的那个,这次的代码明显短了很多。/*用状态机实现对代码中注释的清除.Visual C++ 2005 编译08.6.26zhaoyg*/ #include <stdio.h>#include <string.h> #define SCREEN void initialize_fsm(char fsm[7][256]); int main(){ int ch , temp = 0 ; int state = 0; char fsm[7][256]; FILE *pfin ; pfin = fopen("sweep-comments.txt","r"); #ifdef SCREEN #define OUT stdout #else FILE *pfout; pfout = fopen("result.txt","w"); #define OUT pfout #endif initialize_fsm(fsm); #pragma region FSM ///尝试#pragma region功能. Visual C++ 2005 while ((ch = fgetc(pfin)) !=EOF) { state = fsm[state][ch]; if ( state != 2 && ch !='*' && temp == '/') fputc(temp,OUT); temp = ch; switch(state) { /*0,5,6执行同一个动作*/ case 5: case 6: case 0: fputc(ch,OUT); break; case 7: state = 0; break; } if(state != 1) temp=0; } #pragma endregion} void initialize_fsm(char fsm[7][256]){ int lenth = sizeof(char)*256; memset(fsm[0],0,lenth); memset(fsm[1],0,lenth); memset(fsm[2],2,lenth); memset(fsm[3],3,lenth); memset(fsm[4],3,lenth); memset(fsm[5],5,lenth); memset(fsm[6],5,lenth); fsm[0]['"'] = 5; fsm[0]['/'] = 1; fsm[1]['/'] = 2; fsm[1]['*'] = 3; fsm[2]['\n'] = 0; fsm[3]['*'] = 4; fsm[4]['/'] = 7; fsm[5]['\\'] = 6; fsm[5]['"'] = 0;}

评论