以下是一个简单的示例,演示了如何使用状态机来解析输入字符串中的数字和运算符。假设输入字符串只包含数字和运算符,并且每个运算符只有一个字符。

#include <stdio.h>

typedef enum {
    STATE_START,
    STATE_NUMBER,
    STATE_OPERATOR
} State;

int main() {
    State currentState = STATE_START;
    char input[] = "3+4*2";
    int number = 0;
    char operator;

    for (int i = 0; input[i] != '\0'; i++) {
        switch (currentState) {
            case STATE_START:
                if (isdigit(input[i])) {
                    currentState = STATE_NUMBER;
                    number = input[i] - '0';
                }
                break;
            case STATE_NUMBER:
                if (isdigit(input[i])) {
                    number = number * 10 + (input[i] - '0');
                } else {
                    printf("Number: %d\n", number);
                    currentState = STATE_OPERATOR;
                    operator = input[i];
                }
                break;
            case STATE_OPERATOR:
                if (isdigit(input[i])) {
                    currentState = STATE_NUMBER;
                    number = input[i] - '0';
                }
                break;
        }
    }

    if (currentState == STATE_NUMBER) {
        printf("Number: %d\n", number);
    }

    return 0;
}

在上面的示例中,我们定义了三个不同的状态:开始状态(STATE_START),数字状态(STATE_NUMBER)和运算符状态(STATE_OPERATOR)。

我们使用一个循环遍历输入字符串中的每个字符,并根据当前状态执行适当的操作。在每个状态中,我们检查当前字符的类型,并根据情况更新状态和变量的值。

在状态开始时,我们检查当前字符是否是数字。如果是数字,则将状态更改为数字状态,并将数字的值存储在变量number中。

在数字状态中,我们继续读取连续的数字字符,并使用乘法和加法操作将它们转换为整数。当我们遇到一个运算符时,我们打印出当前的数字并将状态更改为运算符状态,并将运算符的值存储在变量operator中。

在运算符状态中,我们检查当前字符是否是数字,如果是,则将状态更改为数字状态,并将数字的值存储在变量number中。

最后,在循环结束时,我们检查最后一个字符之后的状态。如果状态为数字状态,则打印出最后一个数字。

在上面的示例中,我们只处理了简单的加法和乘法运算符,但你可以根据需要扩展该状态机来处理其他运算符和更复杂的表达式

C程序状态机例子

原文地址: https://www.cveoy.top/t/topic/hQgw 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录