用C++写一个 状态机的demo
时间: 2023-05-26 21:04:49 浏览: 146
以下是一个简单的状态机示例,它将字符串解析为整数,并根据输入字符切换状态。
```c
typedef enum {
STATE_START, // 初始状态
STATE_INT, // 数字状态
STATE_END, // 结束状态
STATE_ERROR // 错误状态
} State;
int str_to_int(const char *str) {
State state = STATE_START;
int result = 0;
int sign = 0;
while (*str != '\0') {
char c = *str++;
switch (state) {
case STATE_START:
if (c == '+') {
sign = 1;
state = STATE_INT;
} else if (c == '-') {
sign = -1;
state = STATE_INT;
} else if (isdigit(c)) {
result = c - '0';
state = STATE_INT;
} else if (isspace(c)) {
// 无操作
} else {
state = STATE_ERROR;
}
break;
case STATE_INT:
if (isdigit(c)) {
result = result * 10 + (c - '0');
} else if (isspace(c)) {
state = STATE_END;
} else {
state = STATE_ERROR;
}
break;
default:
state = STATE_ERROR;
break;
}
}
return (state == STATE_END) ? result * sign : 0;
}
```
代码通过 `switch` 语句实现状态转移,并使用枚举常量定义状态。在 `STATE_START` 状态下,代码将读取输入字符,如果是 `+`、`-` 和数字,它将设置符号和结果,并进入 `STATE_INT` 状态。如果输入字符是空格,则状态转移到下一个字符。在 `STATE_INT` 状态下,代码将读取输入字符,如果是数字,则更新结果,否则退出循环。如果输入字符是空格,则将状态设置为 `STATE_END`,结束循环。如果输入不是数字或空格,则将状态设置为 `STATE_ERROR`。最后,如果状态为 `STATE_END`,则返回结果和符号的乘积,否则返回 0。
阅读全文