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

本文介绍了一种通过状态机解决在C/C++代码中去除注释的方法,包括状态机的原理、状态转移表及具体实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

            

状态\输入\'回车其它
01023400
15620400
22202222
30000000
44444044
55555575
66866666
71023400
87866666


                                                                                               


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

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

程序如下:

#include <stdio.h>
#include <stdlib.h>
#include <string>
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;
}



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值