在嵌入式系统上解析字符串的有效方法是什么?

时间:2015-06-26 13:23:16

标签: c string parsing embedded avr

我是关于内存等的整体嵌入式思考的新手。我想知道解析已知结构的字符串的最有效方法,但嵌入式系统的长度未知。 (欢迎每个嵌入式开发人员应该知道的一些方法。)

我的结构就像下面的一个大胆的结构。这些是确定我的avr要执行的某些操作的基本命令。我不想因为原因而使用String类。

数字分隔符字符串分隔符字符串

我对协议没有任何权力。我有一个使用strtok()strcpy()的函数的解决方案。我用令牌填充数组然后我有一些if / else if条件来执行操作。

但是我想知道是否有像状态机这样的解决方案(按字符读取)或类似的解决方案,它在嵌入式系统上工作效率更高。我现在搜索了很长一段时间,我很感激收到关于这个相当常见的字符串解析问题的任何提示。

输入的Thx。我不是要求解决方案,而是要求一种方法。

4 个答案:

答案 0 :(得分:2)

带有缓冲区数组的简单while循环将保存一些处理,沿着以下行(没有错误检查或其他任何内容)

 pos = 0;
 while (c = get_next_char(), c != delim) { buff[BUFF_N][pos++] = c; }
 buff[BUFF_N][pos] = 0;

 pos = 0;
 while (c = get_next_char(), c != delim) { buff[BUFF_S1][pos++] = c; }
 buff[BUFF_S1][pos] = 0;

 pos = 0;
 while (c = get_next_char(), c != '\n') { buff[BUFF_S2][pos++] = c; }
 buff[BUFF_S2][pos] = 0;

使用strtok和strcpy,因为你将字符读到正确的位置,效率会稍微提高。

答案 1 :(得分:2)

我不同意自动使用strtok进行嵌入式系统,因为它修改了第一个参数(大字符串通常只能读取)。使用strchr(),strspn()或strcspn()来实现相同的目标非常简单,您可以控制是否修改原始字符串并使用指针或strncpy()并将其终止写可记忆。

答案 2 :(得分:1)

假设您尝试解析一些非平凡的事情,请查看flexbison

学习曲线相当陡峭,但与其他方法相比,它有两大优势。

  1. 可以很好地处理错误形成的文本,并提供其他方法可能导致崩溃或安全​​问题的地方。
  2. 它不使用外部库,因此只使用实际生成的解析代码。

答案 3 :(得分:0)

我认为strtok()应该足够了。根据硬件的限制程度,你应该避免使用strcpy(),因为你最终会在内存中保存两次字符串。

使用strtok()定位您的字符串,然后将地址分配给指针,供以后使用。这样你有原始的字符串,但是它可能加上三或四个指针,这将占用固定的12/16字节。