C语言状态机的实现

 【转载2】有限状态机的c实现

2007-05-11 15:12

網絡上可以搜索到很多有限狀態機的代碼和理論分析,這兒僅僅是做一個簡單的例子,僅供入門參考。

这儿以四位密码校验作为状态机的例子,连续输入2479就可以通过密码测试。一个非常简单的例子,在实际的状态机实例中,状态转移表要更復雜一些,不過方式非常

類似。在狀態查詢的地方可以做優化,同時對于輸入量也可以做有效性優化。具體代碼如下:


view plaincopy to clipboardprint?
c.h   
   
typedef enum{   
STATE1 = 1,   
STATE2,   
STATE3,   
STATE4,   
STATE5,//password pass   
//...ADD here   
}STATE;   
   
typedef enum{   
INPUT1 = '2',   
INPUT2 = '4',   
INPUT3 = '7',   
INPUT4 = '9',   
}INPUT;   
   
typedef struct   
 
STATE cur_state;   
INPUT input;   
STATE next_state;   
}STATE_TRANS;   
c.h

typedef enum{
STATE1 = 1,
STATE2,
STATE3,
STATE4,
STATE5,//password pass
//...ADD here
}STATE;

typedef enum{
INPUT1 = '2',
INPUT2 = '4',
INPUT3 = '7',
INPUT4 = '9',
}INPUT;

typedef struct
{
STATE cur_state;
INPUT input;
STATE next_state;
}STATE_TRANS;

c.c   

#include    <stdio.h>   
#include "c.h"   
   
STATE_TRANS state_trans_arry[] =   
 
{STATE1,INPUT1,STATE2},   
{STATE2,INPUT2,STATE3},   
{STATE3,INPUT3,STATE4},   
{STATE4,INPUT4,STATE5},   
};   
#define STATE_TRANS_CNT (sizeof(state_trans_arry)/sizeof(state_trans_arry[0]))   
   
int main()       
 
int i;   
char ch;   
STATE state_machine = STATE1;   
   
while(ch != 'e')   
 
    ch = getchar();   
    if((ch >= '0') && (ch <= '9'))//for digit password input only   
     
    for(i = 0;i < STATE_TRANS_CNT;i++)   
     
        if((ch == state_trans_arry .input) && (state_machine == state_trans_arry.cur_state))   
         
        state_machine = state_trans_arry .next_state;   
      continue;   
       
     else if(i == (STATE_TRANS_CNT - 1))//no transfer match,reset state   
       
      state_machine = STATE1;   
       
     
    if(state_machine == STATE5)   
     printf("Password correct,state transfer machine pass!\n");   
     
 
return 0;   
 
c.c

#include   <stdio.h>  
#include "c.h"

STATE_TRANS state_trans_arry[] =
{
{STATE1,INPUT1,STATE2},
{STATE2,INPUT2,STATE3},
{STATE3,INPUT3,STATE4},
{STATE4,INPUT4,STATE5},
};
#define STATE_TRANS_CNT (sizeof(state_trans_arry)/sizeof(state_trans_arry[0]))

int main()  
{
int i;
char ch;
STATE state_machine = STATE1;

while(ch != 'e')
{
   ch = getchar();
   if((ch >= '0') && (ch <= '9'))//for digit password input only
   {
    for(i = 0;i < STATE_TRANS_CNT;i++)
    {
     if((ch == state_trans_arry
.input) && (state_machine == state_trans_arry .cur_state))
     {
      state_machine = state_trans_arry
.next_state;
    // continue;

        break;        //做了修改在vc上可以实现
        }
        else if(i == (STATE_TRANS_CNT - 1))//no transfer match,reset state
        {
        state_machine = STATE1;
        }
    }
    if(state_machine == STATE5)
        printf("Password correct,state transfer machine pass!\n");
    }
}
return 0;
}

 

 

更多内容可以参考http://blog.csdn.net/guocai_yao/archive/2009/04/17/4087216.aspx

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言中使用switch语句结合一个状态变量实现状态机是相当常见的一种方式。状态机是一种模型,它描述了一系列状态和在这些状态之间的转移。通常来说,状态机中的每个状态都绑定了一些动作。 在C语言中,我们可以使用一个枚举类型表示状态机的状态。例如: ```c enum state { STATE_IDLE, STATE_RECEIVE, STATE_PROCESS, STATE_SEND }; ``` 这个枚举类型定义了四个状态:空闲、接收、处理、发送。接下来,我们定义一个变量来表示状态机的当前状态: ```c enum state current_state = STATE_IDLE; ``` 在代码中,我们通过switch语句根据当前状态进行相应的操作。例如: ```c switch (current_state) { case STATE_IDLE: /* 从空闲状态进入接收状态 */ current_state = STATE_RECEIVE; break; case STATE_RECEIVE: /* 接收到数据 */ /* 处理数据后进入处理状态 */ current_state = STATE_PROCESS; break; case STATE_PROCESS: /* 数据处理完成 */ /* 进入发送状态 */ current_state = STATE_SEND; break; case STATE_SEND: /* 发送数据完成 */ /* 返回到空闲状态 */ current_state = STATE_IDLE; break; default: /* 状态异常,出错处理 */ break; } ``` 在这个例子中,我们使用switch语句根据当前状态来执行相应的逻辑。在每个switch分支中,我们修改状态变量current_state来进行状态转移。当状态异常时,我们可以在default分支中进行出错处理。 总的来说,使用switch语句和一个状态变量来实现状态机是一种简单有效的方式。同时,我们可以通过使用enum类型来提高代码可读性和可维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值