搜索
bottom↓
回复: 19

c有没有什么方法把比如"25*10+1"的字符串计算出来?

[复制链接]

出0入0汤圆

发表于 2017-10-9 19:27:29 来自手机 | 显示全部楼层 |阅读模式
现在解释器有这个功能,但是我是用C工程开发,需要这个字符串计算机功能

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入4汤圆

发表于 2017-10-9 19:33:28 | 显示全部楼层
字符串查找运算符分隔后计算不难吧

出0入0汤圆

 楼主| 发表于 2017-10-9 19:35:06 来自手机 | 显示全部楼层
sniper.q 发表于 2017-10-9 19:33
字符串查找运算符分隔后计算不难吧

还有括号等先后顺序

出0入0汤圆

 楼主| 发表于 2017-10-9 19:35:55 来自手机 | 显示全部楼层
就加减乘除可以了,字符串长度可以随意

出0入0汤圆

发表于 2017-10-9 19:36:24 | 显示全部楼层
自己写个解释器.

出0入0汤圆

 楼主| 发表于 2017-10-9 19:43:47 来自手机 | 显示全部楼层
rmdyj 发表于 2017-10-9 19:36
自己写个解释器.

比较高深,我先找找有没现成的,我想肯定有

出0入4汤圆

发表于 2017-10-9 19:53:08 | 显示全部楼层
本帖最后由 atommann 于 2017-10-9 19:59 编辑

可以用 https://www.gnu.org/software/libmatheval/manual/libmatheval.html

能否把字符串表达成 RPN 方式? 然后 C 中应该有 RPN 库,比如 25 10 * 1 +
如果可以表达成 s-expression 也能用 http://sexpr.sourceforge.net/
(+ (* 25 10) 1)

有人说直接用 Lua 的库
有人说有 https://github.com/codeplea/tinyexpr
有人说用 http://expreval.sourceforge.net/

出0入4汤圆

发表于 2017-10-9 19:53:26 | 显示全部楼层
3050311118 发表于 2017-10-9 19:43
比较高深,我先找找有没现成的,我想肯定有

肯定有现成的,SQL语句就可以计算,如果你在PC上用直接执行SQL语句,MCU上找不到现成的可以,去看看开源的SQL解析器比如sqlite

出0入0汤圆

发表于 2017-10-9 19:53:48 | 显示全部楼层
我记得当时是学编译原理还是数据结构来着,有楼主标题这么一道经典例题,用栈来实现的。
以“C 表达式求值 栈”为关键词搜索,能搜到一些结果,不过都是C++实现的

出0入0汤圆

 楼主| 发表于 2017-10-9 20:03:04 来自手机 | 显示全部楼层
lcofjp 发表于 2017-10-9 19:53
我记得当时是学编译原理还是数据结构来着,有楼主标题这么一道经典例题,用栈来实现的。
以“C 表达式求值  ...

好的,现在脚本解释器都有这功能,c还得研究下

出0入0汤圆

 楼主| 发表于 2017-10-9 20:03:24 来自手机 | 显示全部楼层
atommann 发表于 2017-10-9 19:53
可以用 https://www.gnu.org/software/libmatheval/manual/libmatheval.html

能否把字符串表达成 RPN 方式 ...

这么好,我看看

出0入0汤圆

 楼主| 发表于 2017-10-9 20:05:04 来自手机 | 显示全部楼层
atommann 发表于 2017-10-9 19:53
可以用 https://www.gnu.org/software/libmatheval/manual/libmatheval.html

能否把字符串表达成 RPN 方式 ...

非常感谢 tinyexp正是我想要的

出10入23汤圆

发表于 2017-10-9 20:42:48 来自手机 | 显示全部楼层
lex+yacc   

出0入0汤圆

发表于 2017-10-9 21:08:52 来自手机 | 显示全部楼层
很经典的算法,记得是栈实现的。

出0入0汤圆

发表于 2017-10-9 21:17:16 来自手机 | 显示全部楼层
http://m.blog.csdn.net/kanamisama0/article/details/52866025

出0入0汤圆

发表于 2017-10-9 21:24:08 | 显示全部楼层
编程中的大难点之一

出0入10汤圆

发表于 2017-10-9 21:37:51 | 显示全部楼层
gongxd 发表于 2017-10-9 21:24
编程中的大难点之一

请参考我的这篇文章,其实这个不难,就是一个有限状态机


编译器的实现:
https://www.amobbs.com/thread-5680903-1-1.html

出0入0汤圆

发表于 2017-10-9 23:30:47 | 显示全部楼层
逆波兰表达式 二叉树

出0入0汤圆

发表于 2017-10-10 08:38:19 | 显示全部楼层

出0入0汤圆

发表于 2017-10-10 09:15:18 | 显示全部楼层
递归的方法发一波。
之前一直在用的。


  1. /**
  2.   * @brief  Four arithmetic operation.
  3.   * @param  *s: Expression start.
  4.   * @param  *e: Expression end
  5.   * @retval ret
  6.   */
  7. int calc(const char *s, const char *e)
  8. {
  9.     int layer = 0;
  10.     const char *p;

  11.     for (p = e; p >= s; --p) {
  12.         switch (*p) {
  13.         case ')': ++layer; break;
  14.         case '(': --layer; break;
  15.         case '+':
  16.             if (0 == layer) return calc(s, p - 1) + calc(p + 1, e);
  17.             break;
  18.         case '-':
  19.             if (0 == layer) return calc(s, p - 1) - calc(p + 1, e);
  20.             break;
  21.         }
  22.     }

  23.     for (p = e; p >= s; --p) {
  24.         switch (*p) {
  25.         case ')': ++layer; break;
  26.         case '(': --layer; break;
  27.         case '*':
  28.             if (0 == layer) return calc(s, p - 1) * calc(p + 1, e);
  29.             break;

  30.         case '/':
  31.             if (0 == layer) return calc(s, p - 1) / calc(p + 1, e);
  32.             break;
  33.         }
  34.     }
  35.      
  36.     if ('(' == *s && ')' == *e) return calc(s + 1, e - 1);
  37.     return atoi(s);
  38. }
复制代码
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-24 15:28

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表