我是关于内存等的整体嵌入式思考的新手。我想知道解析已知结构的字符串的最有效方法,但嵌入式系统的长度未知。 (欢迎每个嵌入式开发人员应该知道的一些方法。)
我的结构就像下面的一个大胆的结构。这些是确定我的avr要执行的某些操作的基本命令。我不想因为原因而使用String类。
数字分隔符字符串分隔符字符串
我对协议没有任何权力。我有一个使用strtok()
,strcpy()
的函数的解决方案。我用令牌填充数组然后我有一些if / else if条件来执行操作。
但是我想知道是否有像状态机这样的解决方案(按字符读取)或类似的解决方案,它在嵌入式系统上工作效率更高。我现在搜索了很长一段时间,我很感激收到关于这个相当常见的字符串解析问题的任何提示。
输入的Thx。我不是要求解决方案,而是要求一种方法。
答案 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)
假设您尝试解析一些非平凡的事情,请查看flex和bison。
学习曲线相当陡峭,但与其他方法相比,它有两大优势。
答案 3 :(得分:0)
我认为strtok()应该足够了。根据硬件的限制程度,你应该避免使用strcpy(),因为你最终会在内存中保存两次字符串。
使用strtok()定位您的字符串,然后将地址分配给指针,供以后使用。这样你有原始的字符串,但是它可能加上三或四个指针,这将占用固定的12/16字节。