菜鸟提问,三至七个参数的的命令语句除了 ifelse 还要更好的处理方案否

2021-07-19 17:05:08 +08:00
 lrzsw2008
C,嵌入式的。
只想问大概思路 ,
大概是
case1 头语句(识别用) 序列号(识别用) 参数 1 参数 2 参数 3 参数 4 参数 5 末尾语句
case2 头语句(识别用) 序列号(识别用) 参数 1 参数 2 参数 3 末尾语句
case3 头语句(识别用) 序列号(识别用) 参数 1 末尾语句
case4 头语句(识别用) 序列号(识别用) 末尾语句
以上四种情况都是正确的输入命令
除此外 同样可以被识别并被处理的有
case 头语句 错误序列号 ...
case 错误头语句都要单独列出来....

尝试花了一个下午用 if 和 else 去写,然后自己已经头晕了
各个参数的位置是恒定的所以我是采取 strtok 直接按顺序拆分比对 ,
1008 次点击
所在节点    问与答
5 条回复
shyrock
2021-07-19 17:59:40 +08:00
如果可以,最好把真实问题贴出来(至少是一部分),你这种抽象和翻译并不能帮助大家理解问题,进而帮助你。
lrzsw2008
2021-07-19 18:24:11 +08:00
@shyrock
谢谢提醒。

我现在需要处理一串文本。
完整格式是“SETTING SN 号码 UID 时间 参数 a 参数 B 参数 C END\”
但是有时候收到的文本会是“SETTING SN 号码 UID 时间 参数 A END\”
又或者是“SETTING SN 号码 UID END\”
又又或者是“SETTING SN 号码 END\”

一开始我觉得可以用 strtok 函数以空格为界逐次拆分文本,并且每次拆分判断拆分下来的内容正确与否(比如 setting 这个协议头字符对不对,SN 号码对不对)和判断是否到了“END\"
但是实际上却发现这样写起来非常吃力,且毫无可维护性。
所以想问 类似的情况是否有其他什么解决方案呢
wudicgi
2021-07-19 19:29:22 +08:00
C 语言的话,简单、清晰的写法就是写个状态机了,用库函数以空格为分隔符依次获取每个部分,并处理
写完大概就是 strtok(), strcmp() 加上若干 while, if 语句吧

要写得更“好看”的话可能就要引入额外的数据结构了,效率会下降,可能还没这个清晰
wudicgi
2021-07-19 19:32:48 +08:00
哦,对了, strtok() 不太安全, C11 里有 strtok_s(), 但嵌入式的环境大概率没这个函数可用,这个可能得自己看下
strcmp() 有 strncmp() 可用,不一定非得用 strcmp_s()
lrzsw2008
2021-07-20 09:35:24 +08:00
@wudicgi 谢谢指点,有 strtok_r,现在打算先用 strtok 走一圈算一下有几个参数再进行匹配

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/790423

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX