2013-02-01 61 views
1

我會用一個例子開始命令行以操作和使用它們的代碼中操作

[email protected] ./example + 3 5 

應該返回8.

我接受的參數中,但我怎麼轉換「+」 從

char* opp = argv[1]; 

+ 

在我的代碼裏面使用?

因爲我想使用相當多的操作符有沒有辦法做到這一點,而不使用大的if語句?

我希望那樣清楚,謝謝!

+0

你想要的是解析一個數學表達式 - 抱歉,但這不會是微不足道的。 – 2013-02-01 22:34:19

回答

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; 
} 
+0

但我想用很多運營商即。 *, - ,/,%等。並沒有一個大的if或switch語句? – user1724416

+0

@ user1724416你遲早會得到某種條件陳述。您不能在語言中使用輸入作爲運算符。 –

2

如何像:

char op = argv[1][0]; 

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

或者可能:

switch (op) 
{ 
case '+': 
    add(argv[2], argv[3]); 
    break; 
... 
} 
5

你必須有一些來自char到操作類的映射。假設你已經有了一些整型變量35xy,簡單的解決方法是使用一個switch聲明:

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

或者,你可以有一個std::mapchar 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

+1地圖解決方案! – us2012

0

這個問題的最通用的解決方案是構建一個分析樹,以便您可以將其擴展爲更大的輸入。

解析樹基本上是二叉樹,它提供了操作數和運算符之間關係的表示,每個葉節點都是運算符,葉子本身就是操作數,所以當你想分析或解釋一個表達式時,你可以從樹的底部開始,並在樹上時解析表達式。

最簡單的方法是通過製作遞歸下降解析器,您創建兩個堆棧,一個用於運算符,另一個用於操作數,當您找到運算符時,將它們與它們各自的操作數一起推入堆棧,以及何時您以較低的優先級訪問操作員,並根據需要從堆棧和操作數中彈出一個操作員,然後創建一個節點。

如果你不想經歷創建自己的解析器的麻煩,我發現boost有一些實用程序可以幫助你。但我沒有親自使用它們,所以你必須仔細閱讀文檔以查看它們是否有用。 http://www.boost.org/doc/libs/1_34_1/libs/spirit/doc/trees.html