我试图在C中创建一个简单的有限状态机,我对如何开始感到困惑。 我尝试在网上看,但没有什么能真正为我解决这个问题。
我的目标是检查字符串是八进制,hex还是十进制。
要成为八进制,字符串必须以0开头,后跟数字0-7。 要成为hex,字符串必须以0x或OX开头,然后是(af,AF,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; } }
这个概念对我来说仍然是一个新概念,我很难理解它的实现。 如果有人可以解决一些问题,那将非常感激。
这是一个非常直截了当的问题,解决方案也非常简单。
我有7个状态,即0到6,如图0所示,是初始状态。 3,4,5可能是最终状态,6是死亡状态。
state 0 :初始状态,从这个状态我们只能遇到以下字符:
0或O或1-9
如果有任何其他字符然后出现错误,则无需进一步处理。
state 1 :如果来自状态0的char为0,那么这是下一个状态和
如果来自此状态的char为x,则字符串为hex(state = 4),无需进一步处理,因为任何char都可以跟随。
如果来自这个状态的char是0-7然后string是八进制(state = 5)并且我们处理直到字符串的结尾以查看我们是否得到与0-7不同的任何字符,如果我们这样做那么错误是作为无效字符串和一旦我们得到它,就不需要进一步处理。
状态2 :如果来自状态0的char是O然后这是下一个状态,并且从这个状态,如果下一个char是X,则string是hex(state = 4)并且不需要进一步处理,如果不是则那么错误就在那里。
状态3 :如果来自状态0的char是1-9那么字符串是十进制数(state = 3)并且我们处理直到字符串的结尾以查看我们是否得到与0-9不同的任何字符,如果我们这样做那么错误就在那里作为无效字符串,一旦我们得到它就不需要进一步处理。
状态4 :hex数
状态5 :八进制数
状态6 :错误意味着无效的字符串
这是C代码。 我把字符串的长度设为9,只是为了简单而没有别的。
#include #include 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"); }
以上就是c/c++开发分享C中的有限状态机相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/562127.html