c_key

  • 格式:doc
  • 大小:28.00 KB
  • 文档页数:2

这儿以四位密码校验作为状态机的例子,连续输入2479就可以通过密码测试。

一个非常简单的例子,在实际的状态机实例中,状态转移表要更復雜一些,不過方式非常類似。

在狀態查詢的地方可以做優化,同時對于輸入量也可以做有效性優化。

具體代碼如下:
c.h
typedef enum{
STA TE1 = 1,
STA TE2,
STA TE3,
STA TE4,
STA TE5,//password pass
//...ADD here
}STA TE;
typedef enum{
INPUT1 = '2',
INPUT2 = '4',
INPUT3 = '7',
INPUT4 = '9',
}INPUT;
typedef struct
{
STA TE cur_state;
INPUT input;
STA TE next_state;
}STA TE_TRANS;
c.c
#include <stdio.h>
#include "c.h"
STA TE_TRANS state_trans_arry[] =
{
{STA TE1,INPUT1,STA TE2},
{STA TE2,INPUT2,STA TE3},
{STA TE3,INPUT3,STA TE4},
{STA TE4,INPUT4,STA TE5},
};
#define STATE_TRANS_CNT (sizeof(state_trans_arry)/sizeof(state_trans_arry[0]))
int main()
{
int i;
char ch;
STA TE state_machine = STA TE1;
ch = getchar();
while(ch != 'e')
{
if((ch >= '0') && (ch <= '9'))//for digit password input only
{
for(i = 0;i < STATE_TRANS_CNT;i++)
{
if((ch == state_trans_arry[i].input) && (state_machine == state_trans_arry[i].cur_state))
{
state_machine = state_trans_arry[i].next_state;
ch = getchar();
}
else //no transfer match,reset state
{
break;
}
}
if(state_machine == STA TE5)
printf("Password correct,state transfer machine pass!\n");
}
ch = getchar();
}
return 0;
}。