Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中的有限状态机_C_Switch Statement_State Machine - Fatal编程技术网

C语言中的有限状态机

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语句遍历整个字符串,并

我试图用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;
      }
  }

这个概念对我来说还是很新的,我很难理解它的实现。如果有人能解释一下,我将不胜感激。

这是一个非常直截了当的问题,解决方法也非常简单

我有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此外,您将结果与状态混淆。。。八进制、十六进制和十进制应该是状态机的最终结果,而不是它的状态