1

我将从一个例子开始

me@blabla ./example + 3 5

应该返回 8。

我接受了论点,但我如何将“+”从

char* opp = argv[1];  

到一个

+ 

在我的代码中使用?

因为我想使用很多运算符,有没有办法在不使用大 if 语句的情况下做到这一点?

我希望这很清楚,谢谢!

4

4 回答 4

5

您必须有某种从char到 运算符的映射。假设您已经在一些整数变量中得到3and ,简单的解决方案是使用语句:5xyswitch

switch (opp[0]) {
  case '+': result = x + y; break;
  case '-': result = x - y; break;
  // and so on...
}

或者,你可以有一个std::mapfrom chars to std::function<int(const int&,const int&)>

typedef std::function<int(const int&,const int&)> ArithmeticOperator;
std::map<char, ArithmeticOperator> ops =
  {{'+', std::plus<int>()},
   {'-', std::minus<int>()},
   // and so on...
  };

int result = ops[opp[0]](x,y);
于 2013-02-01T22:41:04.097 回答
2

怎么样:

char op = argv[1][0];

if (op == '+')
    add(argv[2], argv[3]);

或者可能:

switch (op)
{
case '+':
    add(argv[2], argv[3]);
    break;
...
}
于 2013-02-01T22:34:26.513 回答
1

您可以根据您将接受的运算符列表测试给定的运算符。

#include <iostream>
#include <string>
#include <boost/lexical_cast.hpp>

int main(int argc, char* argv[])
{
  if (argc <= 3)
  {
    std::cout << "<op> <num1> <num2>\n";
    return 1;
  }

  const std::string op = argv[1];
  const int arg1 = boost::lexical_cast<int>(argv[2]);
  const int arg2 = boost::lexical_cast<int>(argv[3]);

  cout << arg1 << op << arg2 << " = ";

  if (op == string("+"))    // <== Here is where you turn "+" into +
  {
    cout << arg1 + arg2 << "\n";
  }
  else if (op == string("*"))  // <== or "*" into *
  {
    cout << arg1 * arg2 << "\n";
  }
  else
  {
    cout << "I don't know how to do that yet.\n";
    return 2;
  }

  return 0;
}
于 2013-02-01T22:33:18.053 回答
0

这个问题最通用的解决方案是构建一个解析树,以便您可以将其扩展到更大的输入。

解析树基本上是二叉树,它提供了操作数和运算符之间关系的表示,每个节点到叶子都是一个运算符,叶子本身就是操作数,因此当您想要分析或解释表达式时,您可以从底部开始的树,并在你上树时解决表达式。

最简单的方法是创建一个递归下降解析器,创建两个堆栈,一个用于运算符,一个用于操作数,当您找到运算符时,将它们与各自的操作数一起推入堆栈,当您到达运算符时使用较低的优先级,您可以根据需要从堆栈中弹出一个运算符和操作数,然后创建一个节点。

如果您不想经历创建自己的解析器的麻烦,我发现 boost 有一些实用程序可以为您做到这一点。但我没有亲自使用过它们,因此您必须查看文档以查看它们是否有用。http://www.boost.org/doc/libs/1_34_1/libs/spirit/doc/trees.html

于 2013-02-01T23:01:22.663 回答