C语言中的有限状态机
我试图用C语言创建一个简单的有限状态机,但我对如何开始感到困惑。我试着在网上找,但没有什么能帮我解决这个问题 我的目标是检查字符串是八进制、十六进制还是十进制 要成为八进制,字符串必须以0开头,后跟数字0-7。 要成为十六进制,字符串必须以0x或OX开头,后跟a-f、a-f、0-9 我创建这些州的尝试是:C语言中的有限状态机,c,switch-statement,state-machine,C,Switch Statement,State Machine,我试图用C语言创建一个简单的有限状态机,但我对如何开始感到困惑。我试着在网上找,但没有什么能帮我解决这个问题 我的目标是检查字符串是八进制、十六进制还是十进制 要成为八进制,字符串必须以0开头,后跟数字0-7。 要成为十六进制,字符串必须以0x或OX开头,后跟a-f、a-f、0-9 我创建这些州的尝试是: typedef enum { ERROR, OCTAL, HEX, DECIMAL } stringStates; 现在,我将使用switch语句遍历整个字符串,并
typedef enum {
ERROR,
OCTAL,
HEX,
DECIMAL
} stringStates;
现在,我将使用switch语句遍历整个字符串,并在不同的状态之间切换,直到正确识别它所属的状态
while (current_Position<=end_String-1)
{
switch( "input something here")
{
case 0:
//process string
break;
case 1:
//process string
break;
case 2:
//process string
break;
case 3:
//process string
break;
default:
break;
}
}
这个概念对我来说还是很新的,我很难理解它的实现。如果有人能解释一下,我将不胜感激。这是一个非常直截了当的问题,解决方法也非常简单 我有7种状态,从0到6,如图所示。0是初始状态。3,4,5可能是最终状态,6可能是死状态 状态0:初始状态,在此状态下,我们只能遇到以下字符: 0或O或1-9 如果有任何其他字符,则存在错误,无需进一步处理 状态1:如果状态0中的字符为0,则这是下一个状态,并且 如果此状态中的字符为x,则字符串为十六进制状态=4,并且不需要进一步处理,因为任何字符都可以跟随 如果此状态的字符为0-7,则字符串为octalstate=5,我们将一直处理到字符串的末尾,以查看是否得到与0-7不同的字符,如果得到,则错误将作为无效字符串存在,并且在得到它后无需进一步处理 状态2:如果状态0中的字符为O,则这是下一个状态,如果下一个字符为X,则字符串为十六进制状态=4,无需进一步处理,如果不是,则存在错误 状态3:如果状态0中的字符为1-9,则字符串为十进制数state=3,我们一直处理到字符串末尾,以查看是否得到与0-9不同的字符,如果得到,则错误作为无效字符串存在,并且在得到它后无需进一步处理 状态4:十六进制数 状态5:八进制数 状态6:表示无效字符串的错误 这是C代码。为了简单起见,我将字符串的长度设为9
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *a="066676777";
int state=0;int i=0;
while(state!=6&&i<9)
{
switch(state)
{
case 0:
if(a[i]=='0')
state=1;
else if(a[i]=='O')
state=2;
else if(a[i]>=49&&a[i]<=57)
state=3;
else {state=6;i=9;}
break;
case 1:
if(a[i]=='x')
{
state=4;i=9;
}
else if(a[i]>=48&&a[i]<=55)
{
state=5;
while(i<9)
if(a[i]>=48&&a[i]<=55)
++i;
else {state=6;i=9;}
}
else {state=6;i=9;}
break;
case 2:
if(a[i]=='X')
{
state=4;i=9;
}
else {state=6;i=9;}
break;
case 3:
while(i<9)
if(a[i]>=48&&a[i]<=57)
++i;
else {state=6;i=9;}
break;
default:
printf("please select correct initial state");
break;
}
++i;
}
if(state==3)
printf("it is a decimal number");
else if(state==4)
printf("it is a hexadecimal number");
else if(state==5)
printf("it is a octal number");
else printf("error encountered as invalid string");
}
这是一个非常直截了当的问题,解决方法也非常简单 我有7种状态,从0到6,如图所示。0是初始状态。3,4,5可能是最终状态,6可能是死状态 状态0:初始状态,在此状态下,我们只能遇到以下字符: 0或O或1-9 如果有任何其他字符,则存在错误,无需进一步处理 状态1:如果状态0中的字符为0,则这是下一个状态,并且 如果此状态中的字符为x,则字符串为十六进制状态=4,并且不需要进一步处理,因为任何字符都可以跟随 如果此状态的字符为0-7,则字符串为octalstate=5,我们将一直处理到字符串的末尾,以查看是否得到与0-7不同的字符,如果得到,则错误将作为无效字符串存在,并且在得到它后无需进一步处理 状态2:如果状态0中的字符为O,则这是下一个状态,如果下一个字符为X,则字符串为十六进制状态=4,无需进一步处理,如果不是,则存在错误 状态3:如果状态0中的字符为1-9,则字符串为十进制数state=3,我们一直处理到字符串末尾,以查看是否得到与0-9不同的字符,如果得到,则错误作为无效字符串存在,并且在得到它后无需进一步处理 状态4:十六进制数 状态5:八进制数 状态6:表示无效字符串的错误 这是C代码。为了简单起见,我将字符串的长度设为9
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *a="066676777";
int state=0;int i=0;
while(state!=6&&i<9)
{
switch(state)
{
case 0:
if(a[i]=='0')
state=1;
else if(a[i]=='O')
state=2;
else if(a[i]>=49&&a[i]<=57)
state=3;
else {state=6;i=9;}
break;
case 1:
if(a[i]=='x')
{
state=4;i=9;
}
else if(a[i]>=48&&a[i]<=55)
{
state=5;
while(i<9)
if(a[i]>=48&&a[i]<=55)
++i;
else {state=6;i=9;}
}
else {state=6;i=9;}
break;
case 2:
if(a[i]=='X')
{
state=4;i=9;
}
else {state=6;i=9;}
break;
case 3:
while(i<9)
if(a[i]>=48&&a[i]<=57)
++i;
else {state=6;i=9;}
break;
default:
printf("please select correct initial state");
break;
}
++i;
}
if(state==3)
printf("it is a decimal number");
else if(state==4)
printf("it is a hexadecimal number");
else if(state==5)
printf("it is a octal number");
else printf("error encountered as invalid string");
}
先画个图表怎么样?看看我的答案:有不止一种方法。您对函数指针是否满意?首先确定输入集,然后绘制状态图或转换表。@Bret此外,您将结果与状态混淆。。。八进制、十六进制、十进制应该是状态机的最终结果。不是它的状态。先画一个图表怎么样?看看我的答案:有不止一种方法。您对函数指针是否满意?首先确定输入集,然后绘制状态图或转换表。@Bret此外,您将结果与状态混淆。。。八进制、十六进制和十进制应该是状态机的最终结果,而不是它的状态