我正在尝试在C中创建一个简单的有限状态机,我对如何开始感到困惑。我尝试在网上看,但没有什么能真正解决这个问题。
我的目标是检查字符串是八进制,十六进制还是十进制。
要成为八进制,字符串必须以0开头,后跟数字0-7。 要成为十六进制,字符串必须以0x或OX开头,然后是(a-f,A-F,0-9)
我创建状态的尝试将是:
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;
}
}
这个概念对我来说仍然是一个新概念,我很难理解它的实现。如果有人能说出一些亮点,那就非常感激了。
答案 0 :(得分:4)
这是一个非常直截了当的问题,解决方案也非常简单。
我有7个状态,即从0到6,如图0所示是初始状态。 3,4,5可能是最终状态,6是死亡状态。
状态0 :初始状态,从此状态我们只能遇到以下字符:
0 或 O 或 1-9
如果有任何其他字符,则存在错误,无需进一步处理。
状态1 :如果状态0的字符 0 ,那么这是下一个状态
如果此状态的char为 x ,则该字符串为十六进制(state = 4),无需进一步处理,因为任何char都可以跟随。
如果来自此状态的char为0-7,则字符串为八进制(state = 5)并且我们处理直到字符串结尾,看看我们是否得到与0-7不同的任何字符,如果我们这样做,那么错误是存在的无效的字符串,一旦我们得到它就不需要进一步处理。
状态2 :如果来自状态0的char是O,那么这是下一个状态,如果下一个char是X,那么从该状态开始,则字符串是十六进制(state = 4),无需进一步处理,如果不是那么错误就在那里。
状态3 :如果来自状态0的char是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");
}