我會用一個例子開始命令行以操作和使用它們的代碼中操作
[email protected] ./example + 3 5
應該返回8.
我接受的參數中,但我怎麼轉換「+」 從
char* opp = argv[1];
到
+
在我的代碼裏面使用?
因爲我想使用相當多的操作符有沒有辦法做到這一點,而不使用大的if語句?
我希望那樣清楚,謝謝!
我會用一個例子開始命令行以操作和使用它們的代碼中操作
[email protected] ./example + 3 5
應該返回8.
我接受的參數中,但我怎麼轉換「+」 從
char* opp = argv[1];
到
+
在我的代碼裏面使用?
因爲我想使用相當多的操作符有沒有辦法做到這一點,而不使用大的if語句?
我希望那樣清楚,謝謝!
您可以根據您接受的操作符列表測試給定的操作符。
#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;
}
但我想用很多運營商即。 *, - ,/,%等。並沒有一個大的if或switch語句? – user1724416
@ user1724416你遲早會得到某種條件陳述。您不能在語言中使用輸入作爲運算符。 –
如何像:
char op = argv[1][0];
if (op == '+')
add(argv[2], argv[3]);
或者可能:
switch (op)
{
case '+':
add(argv[2], argv[3]);
break;
...
}
你必須有一些來自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
s到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地圖解決方案! – us2012
這個問題的最通用的解決方案是構建一個分析樹,以便您可以將其擴展爲更大的輸入。
解析樹基本上是二叉樹,它提供了操作數和運算符之間關係的表示,每個葉節點都是運算符,葉子本身就是操作數,所以當你想分析或解釋一個表達式時,你可以從樹的底部開始,並在樹上時解析表達式。
最簡單的方法是通過製作遞歸下降解析器,您創建兩個堆棧,一個用於運算符,另一個用於操作數,當您找到運算符時,將它們與它們各自的操作數一起推入堆棧,以及何時您以較低的優先級訪問操作員,並根據需要從堆棧和操作數中彈出一個操作員,然後創建一個節點。
如果你不想經歷創建自己的解析器的麻煩,我發現boost有一些實用程序可以幫助你。但我沒有親自使用它們,所以你必須仔細閱讀文檔以查看它們是否有用。 http://www.boost.org/doc/libs/1_34_1/libs/spirit/doc/trees.html
你想要的是解析一個數學表達式 - 抱歉,但這不會是微不足道的。 – 2013-02-01 22:34:19