我将从一个例子开始
me@blabla ./example + 3 5
应该返回8.
我接受了参数,但我如何从
转换“+”char* opp = argv[1];
到
+
在我的代码中使用?
因为我想使用相当多的运算符,有没有办法在不使用大的if语句的情况下执行此操作?
我希望那清楚,谢谢!
答案 0 :(得分:5)
您必须拥有从char
到运营商的某种映射。假设您已在某些整数变量3
和5
中获得x
和y
,则简单的解决方案是使用switch
语句:
switch (opp[0]) {
case '+': result = x + y; break;
case '-': result = x - y; break;
// and so on...
}
或者,您可以std::map
从char
到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);
答案 1 :(得分:2)
如下:
char op = argv[1][0];
if (op == '+')
add(argv[2], argv[3]);
或者可能:
switch (op)
{
case '+':
add(argv[2], argv[3]);
break;
...
}
答案 2 :(得分: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;
}
答案 3 :(得分:0)
解决此问题的最通用解决方案是构建一个解析树,以便您可以将其扩展为更大的输入。
Parse树基本上是二叉树,它提供了操作数和运算符之间关系的表示,每个节点到叶子都是一个运算符,叶子本身就是操作数,因此当你想要分析或解释表达式时,你可以开始在树的底部,当你上到树时解析表达式。
最简单的方法是创建一个递归下降解析器,你创建两个堆栈,一个用于运算符,一个用于操作数,当你找到运算符时,你将它们与它们各自的操作数一起推送到堆栈上,当你到达一个优先级较低的运算符,您可以根据需要从堆栈和操作数中弹出一个运算符,然后创建一个节点。
如果您不想经历创建自己的解析器的麻烦,我发现boost有一些实用程序可以帮助您。但是我没有亲自使用它们,因此您必须查看文档以查看它们是否有用。 http://www.boost.org/doc/libs/1_34_1/libs/spirit/doc/trees.html