2015-05-05 15 views
3

我是C++新手。我正在使用命令行編寫一個簡單的計算器。命令行應該有這樣的格式: PROGRAMNAME firstNumber操作secondNumber 在這裏我得到了什麼至今:使用命令行參數的簡單計算器C++

#include <iostream> 
#include <fstream> 
using namespace std; 

int main(int argc, char* argv[]) 
{ 
    if (argc != 3) 
    { 
     cerr << "Usage: " << argv[0] << endl; 
     exit(0); 
    } 
    else 
    { 
     int firstNumber = atoi(argv[1]); 
     char theOperator = atoi(argv[2]); 
     int secondNumber = atoi(argv[3]); 
     switch (theOperator) 
     { 
     case'+': 
      { 
       cout << "The answer is " << firstNumber + secondNumber << endl; 
       break; 
      } 
     case '-': 
      { 
       cout << "The answer is " << firstNumber - secondNumber << endl; 
       break; 
      } 
     case '*': 
      { 
       cout << "The answer is " << firstNumber * secondNumber << endl; 
       break; 
      } 
     case '/': 
      { 
       if (secondNumber == 0) 
       { 
        cout << "Can not devide by a ZERO" << endl; 
        break; 
       } 
       else 
       { 
        cout << "The answer is " << firstNumber/secondNumber << endl; 
        break; 
       } 
      } 
     } 
    } 
} 

程序無法運行。當我運行它時,它會顯示適當的使用信息並結束程序。誰能幫幫我嗎?

+1

你期望人們輸入'argv [2]'什麼? – Galik

+1

'char theOperator = atoi(argv [2]);'如果argv [2]包含除數字之外的任何內容,''將始終將'theOperator'設置爲零。最有可能的'char theOperator = atoi(argv [2] [0]);'是你想要的。 – mikyra

+0

@mikyra:不,這是錯誤的,原因有兩個。 'atoi'需要一個'char *',而不是一個普通的'char';而運營商不是*號碼*,所以'atoi'完全沒有了。只需使用'theOperator = argv [2] [0]'。 – usr2564301

回答

1

如果您在

programname firstNumber operator secondNumber 

鍵入你有4個參數,而不是3

argv[0] = programname 
argv[1] = firstNumber 
argv[2] = operator 
argv[3] = secondNumber 

看起來像你的程序工作正常......至少就打印用法消息進入。

另請參閱有關使用運算符參數的其他註釋。

1

參數argc也計數程序的名稱。

試試這個:

if (argc != 4) // We expect 4 arguments: programname number operator number 
{ 
    cerr << "Usage: " << argv[0] << " <number> <operator> <number>" << endl; 
    exit(0); 
} 

在代碼中,正確地運行程序(與所有3個參數)顯示錯誤消息,因爲argc等於4

4

其他人已經給你答案,但你可以很容易地自己想出這一個。剛剛打印的內容argc是點在哪裏,你知道的代碼進入:

int main(int argc, char* argv[]) 
{ 
    if (argc != 3) 
    { 
     cout << "argc is: " << argc << endl; // Debug output that you delete later 
     cerr << "Usage: " << argv[0] << endl; 
     exit(0); 
    } 
    else 

,然後再回來什麼argc是。當你發現argc實際上是4,你想知道里面是什麼argc你應該寫一些代碼打印出來,讓你自己看着辦吧......像這樣:

int main(int argc, char* argv[]) 
{ 
    cout << "argc is: " << argc << endl; // Debug output that you delete later 
    for (int i = 0; i < argc; ++i) 
    { 
     // Print out all of the arguments since it's not working as you expect... 
     cout << "argv[" << i << "] = " << argv[i] << endl; 
    } 

    if (argc != 3) 
    { 
     cerr << "Usage: " << argv[0] << endl; 
     exit(0); 
    } 
    else 

,你會非常有很快就知道出了什麼問題......

請學習如何做到這一點,因爲它可以節省您的時間,但將來您不必等待答案。

此外,您的代碼還有另一個錯誤。

爲什麼地球上你將+字符從字符串轉換爲int?

else 
{ 
    int firstNumber = atoi(argv[1]); 
    char theOperator = atoi(argv[2]); // <<< WTF? Why? 
    int secondNumber = atoi(argv[3]); 
    switch (theOperator) 

你可能要到那裏擺脫atoi部分,只是一起去:

char theOperator = argv[2][0]; // First character of the string 

前提是第二個參數將始終只有一個字母......你可能要強制執行/檢查。請參閱strlen()std::string並注意argv[2]的類型爲char*(指向char的指針)。

我也建議您閱讀從SO Howto-Ask Help Page鏈接的How to debug small programs。它可能會有所幫助。不,我認爲你的問題不好。調試小程序是您未來需要的一項技能,如果您打算編程,現在就可以讓您瞭解它。

歡迎使用編程和C++ :)

+1

@Jongware謝謝!固定。 – nonsensickle