【问题标题】:How to convert a string into conditional expression in C++ or C [closed]如何在 C++ 或 C 中将字符串转换为条件表达式 [关闭]
【发布时间】:2013-08-06 12:59:52
【问题描述】:

我有一个string

string expression=((true AND true)OR false); 

如何将此string 转换为条件语句,以便我可以在if 语句中使用它,即

if((true AND true)OR false))

就像 JavaScript 中的 eval - C++ 或 C 中是否有任何 API?

【问题讨论】:

  • 这是一个很好的问题,BLUEPIXY(见下文)有一个令人惊讶的答案。这个问题不应该被搁置,它是 ON TOPIC。

标签: c++ c


【解决方案1】:

您可以使用第三方脚本库,例如 LUA (http://www.lua.org/) 来执行此操作,或者您可以编写自己的表达式解析器(这很重要)。

【讨论】:

    【解决方案2】:

    从根本上说,C / C++ 代码必须在运行之前进行编译,这限制了您像在其他一些语言中那样动态运行代码。

    您可以轻松获得的最接近的行为是将字符串解析为某种内部表示,并让您的代码响应该表示。例如使用提升精神:

    http://boost-spirit.com/home/

    例如这个答案可以满足您的要求,并且具有增强的精神。但是正如你所看到的,这涉及到相当多的努力:

    Boolean expression (grammar) parser in c++

    【讨论】:

      【解决方案3】:
      #include <stdio.h>
      #include <stdlib.h>
      
      int eval(const char *boolean_expression){
          FILE *fp = fopen("temp.c", "w");
          int ret;
          fprintf(fp, 
              "#include <stdbool.h>\n"
              "#include <iso646.h>\n"
              "int main(void){\n"
              "return (int)%s;}", boolean_expression);
          fflush(fp);
          fclose(fp);
          system("gcc temp.c -o temp");
          remove("temp.c");
          ret=system("temp.exe");
          remove("temp.exe");
          return ret;
      }
      
      int main(void){
          const char *expression="((true and true) or false)";
          int condition = eval(expression);
      
          if(condition)
              printf("YES\n");
          else
              printf("NO!\n");
          return 0;
      }
      

      【讨论】:

      • 这将起作用,但有两个主要警告:(1) 它要求用户在他的计算机上安装 gcc(大多数用户没有),以及 (2) 它允许用户在运行程序的机器上运行任意 C 代码,这(取决于程序的使用)可能是一个很大的安全漏洞。例如。该字符串可以包含重新格式化硬盘驱动器或安装键盘记录器等的命令
      • @JeremyFriesner 当然是。所以不要太认真。
      • +1 用于删除 temp.c / temp.exe
      【解决方案4】:

      C 和 C++ 没有 eval 类型功能 - 这是因为该语言已编译,如果您希望能够“编译更多代码”,则需要整个编译器成为运行时的一部分- 不要介意引用现有变量的困难。

      对于这种类型的表达式,编写一些解析和评估表达式的代码并不难——它需要一个堆栈来处理括号和一些简单的运算符,但这并不难。

      显然,集成现有的脚本语言也可以。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-16
        • 2016-08-11
        • 2018-03-20
        • 2015-08-02
        • 1970-01-01
        • 2021-05-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多