當前位置:編程學習大全網 - 源碼下載 - 求壹個C++程序,可以去掉某目錄下所有C++頭文件和源文件中的註釋行。

求壹個C++程序,可以去掉某目錄下所有C++頭文件和源文件中的註釋行。

做壹個狀態機

下面的狀態表示:

0: 正在分析

1:讀到第壹個/

2:讀完第二個/,"//...

3:讀到 "/*...

4:讀到 "/*...*

5:讀到第壹個"

6:讀到字符串裏的轉義符 "...\

7:找到註釋

0和7是等價的狀態,但是可以用7狀態做些特別的事情,比如這個時候刪除剛找到的註釋等。最後的程序如下,輸入輸出還是用C的文件比較方便:

#include "stdio.h"

#include "string"

char fsm[8][128];

void initfsm()

{

const int line_len=sizeof(char)*128;

memset(fsm[0],0,line_len);

memset(fsm[1],0,line_len);

memset(fsm[2],2,line_len);

memset(fsm[3],3,line_len);

memset(fsm[4],3,line_len);

memset(fsm[5],5,line_len);

memset(fsm[6],5,line_len);

memset(fsm[7],0,line_len);

fsm[0]['/']=1;

fsm[0]['"']=5;

fsm[1]['/']=2;

fsm[1]['*']=3;

fsm[1]['"']=5;

fsm[2]['\n']=7;

fsm[3]['*']=4;

fsm[4]['/']=7;

fsm[4]['*']=4;

fsm[5]['"']=0;

fsm[5]['\\']=6;

fsm[7]['/']=1;

fsm[7]['"']=5;

}

int main()

{

int state=0;

char c;

std::string s;

FILE *fin=fopen("e:\\in.txt","r");

FILE *fout=fopen("e:\\out.txt","w");

initfsm();

while(fscanf(fin,"%c",&c)!=EOF)

{

state=fsm[state][c];

s+=c;

switch(state)

{

case 0:

fprintf(fout,"%s",s.c_str());

s="";

break;

case 7:

s="";

if(c=='\n')

{

fputc(c,fout);

}

break;

}

}

fclose(fin);

fclose(fout);

return 0;

}

  • 上一篇:瀏陽源代碼網站
  • 下一篇:uefi怎麽用u盤啟動安裝windows
  • copyright 2024編程學習大全網