用C语言编写有限自动机,C语言实现有限状态机

本文介绍了有限状态机的概念及其在解决实际问题中的应用,特别是在网络协议如TCP中的作用。通过C语言编写的具体实例,阐述了如何定义状态、事件,构建状态机的结构体,并给出了两个去除字符串连续空格的示例,帮助读者理解状态机的实现思路和优势。
摘要由CSDN通过智能技术生成

1. 什么是有限状态机

有限状态机在百度百科上的解释为:

有限状态自动机(FSM “finite state machine” 或者FSA “finite state automaton” )是为研究有限内存的计算过程和某些语言类而抽象出的一种计算模型。有限状态自动机拥有有限数量的状态,每个状态可以迁移到零个或多个状态,输入字串决定执行哪个状态的迁移。有限状态自动机可以表示为一个有向图。

2. 有限状态机的应用场景

在实际工作中,经常遇到状态机的应用,尤其在网络协议部分,最为经典的就是TCP协议的状态机:

6d4b4d1d2cbc2b5cf532d5381ce97c66.png

实际上,很多网络协议都是有工作状态的,不同阶段所处不同的状态,例如DHCP协议,路由协议,SIP协议等等。这些协议在实现的时候多多少少会用到状态机的原理,可能在实现上有较大的差别。我原来只是听说过有这个原理,但只限于听说,但具体实现以及它的优点更是不知所以;

这几天在学习BFD协议的时候,BFD的内核部分就是使用状态机来实现的,这就使我花点时间好好了解下状态机实现的原理,这篇博客主要介绍状态机的最简单实现,因为网上没有找到想要的实现,所以决定自己写几个实例并记录下来。

这几个实例是参照https://blog.csdn.net/zqixiao_09/article/details/50239337的栗子做的,只是这篇文章全是使用的switch-case实现的,所以我做一个补充,使用另一种更符合状态机的实现。

不是说有些问题必须使用状态机,只是使用状态机可以简化问题,代码的逻辑也比较清晰

3.状态机的基本框架

3.1 定义状态

如果要使用状态机进行解决问题,首先要确定这个问题本事有几个状态,然后我们把所用的状态做一个枚举类型的定义,问什么是枚举类型呢? 因为我们定义==状态的目的就是把状态当作索引值==,这可以说是状态机实现的精髓了,因为它就是根据当前的状态来确定下一步的行为。

例如:一个问题有三种状态,则可以使用这样的定义:

enum {

STATE_0 = 0, /* 数据下标从0开始,因此开始设置为0,后边逐渐递增*/

STATE_1,

STATE_2,

}FSM_STATE;

3.2定义事件

定义事件,这个不是必须的。 我是参照BFD内核源码的状态机实现来做实现的几个栗子,定义事件的好处就是可以统一处理各种情况,不需要再每个状态中再单独判断,这样需要花费更长的时间去实现每个状态中的函数。

事件是与状态相对应的,简单的说,从“状态0”切换到“状态1”是由某些特定事件导致的,同理从“状态1”切换到“状态2”是由另一个事件导

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
#include int main() { int state_key = 1; //钥匙状态 为1时钥匙区有钥匙,为时钥匙区 无钥匙 int state_hold = 0; // 钥匙持有状态 为1时持有钥匙,为时 未持有钥匙 int state_door = 0; //门状态 0:关闭 1:打开 int state_lock = 1; //上锁状态 1:上锁 0:解锁 int order; // 用于存放用户输入指令 printf("this is a game.\n"); printf ("if you want to OPEN THE DOOR ,input 1\n"); printf ("if you want to CLOSE THE DOOR ,input 2\n"); printf ("if you want to LOCK THE DOOR ,input 3\n"); printf ("if you want to UNLOCK THE DOOR,input 4\n"); // printf ("if you want to LOCK THE DOOR ,input 5\n"); printf("please input the order\n"); while(1) { scanf("%d",&order); // if(order!=(1||2||3||4)) // { // printf("worng input ,please input again.\n"); // continue; // } switch(order) { case 1 : if(state_door==1) { printf("the door has been opened before\n"); break; } if(state_lock==1) { printf("the door has been lock\n"); break; } state_door=1; break; case 2: if(state_door==0) { printf("the door has been closed before\n"); break; } if(state_lock==1) { printf("the door has been lock\n"); break; } state_door=0; break; case 3: if(state_door==1) { printf("the door has been opened before\n"); break; } if(state_lock==1) { printf("the door has been lock\n"); break; } state_lock=1; break ; case 4: if(state_door==1) { printf("the door has been opened before\n"); break; } if(state_lock==0) { printf("the door has not been lock\n"); break; } state_lock=0; break ; } } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值