V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
lrzsw2008
V2EX  ›  问与答

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

  •  
  •   lrzsw2008 · 2021-07-19 17:05:08 +08:00 · 958 次点击
    这是一个创建于 1024 天前的主题,其中的信息可能已经有所发展或是发生改变。
    C,嵌入式的。
    只想问大概思路 ,
    大概是
    case1 头语句(识别用) 序列号(识别用) 参数 1 参数 2 参数 3 参数 4 参数 5 末尾语句
    case2 头语句(识别用) 序列号(识别用) 参数 1 参数 2 参数 3 末尾语句
    case3 头语句(识别用) 序列号(识别用) 参数 1 末尾语句
    case4 头语句(识别用) 序列号(识别用) 末尾语句
    以上四种情况都是正确的输入命令
    除此外 同样可以被识别并被处理的有
    case 头语句 错误序列号 ...
    case 错误头语句都要单独列出来....

    尝试花了一个下午用 if 和 else 去写,然后自己已经头晕了
    各个参数的位置是恒定的所以我是采取 strtok 直接按顺序拆分比对 ,
    5 条回复    2021-07-20 09:35:24 +08:00
    shyrock
        1
    shyrock  
       2021-07-19 17:59:40 +08:00   ❤️ 2
    如果可以,最好把真实问题贴出来(至少是一部分),你这种抽象和翻译并不能帮助大家理解问题,进而帮助你。
    lrzsw2008
        2
    lrzsw2008  
    OP
       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
        3
    wudicgi  
       2021-07-19 19:29:22 +08:00   ❤️ 1
    C 语言的话,简单、清晰的写法就是写个状态机了,用库函数以空格为分隔符依次获取每个部分,并处理
    写完大概就是 strtok(), strcmp() 加上若干 while, if 语句吧

    要写得更“好看”的话可能就要引入额外的数据结构了,效率会下降,可能还没这个清晰
    wudicgi
        4
    wudicgi  
       2021-07-19 19:32:48 +08:00
    哦,对了, strtok() 不太安全, C11 里有 strtok_s(), 但嵌入式的环境大概率没这个函数可用,这个可能得自己看下
    strcmp() 有 strncmp() 可用,不一定非得用 strcmp_s()
    lrzsw2008
        5
    lrzsw2008  
    OP
       2021-07-20 09:35:24 +08:00
    @wudicgi 谢谢指点,有 strtok_r,现在打算先用 strtok 走一圈算一下有几个参数再进行匹配
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5140 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 04:00 · PVG 12:00 · LAX 21:00 · JFK 00:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.