状态机解决有关删除程序中的注释的问题

  最近几天看程序员面试宝典,有一个面试题:编写程序去掉c,c++中的注释。要按照常规的方法,分析几种情况,会很麻烦,于是上网看看有么有更好的解决方法。

  可以用状态机解决这种情况很多的分支问题。(关于状态机的详细知识,会转载令一篇博客。)

  以下是自己分析的这个题的状态:

            

状态\输入 \ ' 回车 其它
0 1 0 2 3 4 0 0
1 5 6 2 0 4 0 0
2 2 2 0 2 2 2 2
3 0 0 0 0 0 0 0
4 4 4 4 4 0 4 4
5 5 5 5 5 5 7 5
6 6 8 6 6 6 6 6
7 1 0 2 3 4 0 0
8 7 8 6 6 6 6 6


                                                                                               


状态0表示等待输入,或者表示可以正常的输出到另一个文件。

状态7表示找到了注释,并且到了可以消掉的时候。

程序如下:

#include 
#include 
#include 
using namespace std;

char fsm[9][128];
void Init_fsm()
{//初始化状态机
  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],0,line_len);
  memset(fsm[4],4,line_len);
  memset(fsm[5],5,line_len);
  memset(fsm[6],6,line_len);
  memset(fsm[7],0,line_len);
  memset(fsm[8],6,line_len);
  fsm[0]['/']=1;
  fsm[0]['\"']=2;
  fsm[0]['\\']=3;
  fsm[0]['\'']=4;
  fsm[1]['/']=5;
  fsm[1]['*']=6;
  fsm[1]['\"']=2;
  fsm[1]['\\']=0;
  fsm[1]['\'']=4;
  fsm[2]['\"']=0;
  fsm[4]['\'']=0;
  fsm[5]['\n']=7;
  fsm[6]['*']=8;
  fsm[7]['/']=1;
  fsm[7]['"']=2;
  fsm[7]['\\']=3;
  fsm[7]['\'']=4;
  fsm[8]['/']=7;
  fsm[8]['*']=8;
}


int main()
{
  int state=0;
  char c;
  string s;
  FILE *fin=fopen("test.c","r");
  if(!fin)
  {
    printf("ERROR!cant open file test.c");
    return 1;
  }
  FILE *fout=fopen("testout.c","w");
  if(!fout)
  {
    printf("cant open file testout.c");
    return 1;
  }
  Init_fsm();
  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;
}



你可能感兴趣的:(状态机解决有关删除程序中的注释的问题)