V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
lrzsw2008
V2EX  ›  问与答

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

  •  
  •   lrzsw2008 · Jul 19, 2021 · 1306 views
    This topic created in 1751 days ago, the information mentioned may be changed or developed.
    C,嵌入式的。
    只想问大概思路 ,
    大概是
    case1 头语句(识别用) 序列号(识别用) 参数 1 参数 2 参数 3 参数 4 参数 5 末尾语句
    case2 头语句(识别用) 序列号(识别用) 参数 1 参数 2 参数 3 末尾语句
    case3 头语句(识别用) 序列号(识别用) 参数 1 末尾语句
    case4 头语句(识别用) 序列号(识别用) 末尾语句
    以上四种情况都是正确的输入命令
    除此外 同样可以被识别并被处理的有
    case 头语句 错误序列号 ...
    case 错误头语句都要单独列出来....

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

    要写得更“好看”的话可能就要引入额外的数据结构了,效率会下降,可能还没这个清晰
    wudicgi
        4
    wudicgi  
       Jul 19, 2021
    哦,对了, strtok() 不太安全, C11 里有 strtok_s(), 但嵌入式的环境大概率没这个函数可用,这个可能得自己看下
    strcmp() 有 strncmp() 可用,不一定非得用 strcmp_s()
    lrzsw2008
        5
    lrzsw2008  
    OP
       Jul 20, 2021
    @wudicgi 谢谢指点,有 strtok_r,现在打算先用 strtok 走一圈算一下有几个参数再进行匹配
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5708 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 08:44 · PVG 16:44 · LAX 01:44 · JFK 04:44
    ♥ Do have faith in what you're doing.