2012-07-03 122 views
6

我在C++中有一個程序,我運行許多參數值。我想要做的是以下幾點: 比方說,我有兩個參數:來自命令行的輸入

int main(){ 
    double a; 
    double b; 
//some more lines of codes 
} 

現在,經過之後我編譯要運行它作爲

./output.out 2.2 5.4 

這樣a取值2.2和b取值5.4。

當然,一種方法是使用cin>>,但我不能這樣做,因爲我在集羣上運行程序。

+0

爲什麼不使用命令行參數(即argv)?當然,你必須稍後將它們轉換爲「double」類型。 – Mahesh

回答

20

你需要在main使用command line arguments

int main(int argc, char* argv[]) { 
    if (argc != 3) return -1; 
    double a = atof(argv[1]); 
    double b = atof(argv[2]); 
    ... 
    return 0; 
} 

此代碼解析使用atof參數;您可以改用stringstream

+0

不要使用'const char * argv []',只需使用'char * argv []',-1直到修復。 –

+0

@ RichardJ.RossIII現在已經修復。 – dasblinkenlight

+0

現在你得到一個+1 :) –

11

如果你想使用命令行參數,那麼沒有,你不要使用cin,因爲它爲時已晚。您需要將main簽名改爲:

int main(int argc, char *argv[]) { 
    // argc is the argument count 
    // argv contains the arguments "2.2" and "5.4" 
} 

所以,你現在有argv這是指針數組char,每個指針指向一個傳遞的參數。第一個參數通常是您的可執行文件的路徑,隨後的參數是您的應用程序啓動時傳入的任何內容,以指針形式指向char

在這種情況下,您需要將char*轉換爲double

+2

我很確定這是'int argc',而不是'size_t'。如我錯了請糾正我。 – Linuxios

+0

@Linuxios:是的,你說得對。一些編譯器允許'size_t',但標準只要求int main()和int main(int,char * [])被接受,其他的都是實現定義的(C++ 98標準無論如何,我總是躺在......) –

0

您可以使用這種形式的main()功能得到命令行參數

int main(int argc, char* argv[]) { 

    } 

其中argv[]數組的值包含您的命令行變量char*,你將需要轉換爲floatsdoubles在你的情況

3

這就是命令行參數是:

#include <sstream> 

int main(int argc, char *argv[]) 
{ 
    if (argv < 3) 
     // show error 
    double a, b; 

    std::string input = argv[1]; 
    std::stringstream ss = std::stringstream(input); 

    ss >> a; 

    input = argv[2]; 
    ss = std::stringstream(input); 

    ss >> b; 

    // a and b are now both successfully parsed in the application 
} 
3

你看過boost program options

它會像其他許多人所建議的那樣使用命令行參數,並讓您提供非常一致,乾淨且可擴展的命令行界面。

+1

如果你已經在使用boost,那麼很好,但是我不會在應用程序中加入boost來解析一些簡單的命令行參數。 –

+1

我總是發現參數解析開始很簡單,並隨着工具的增長迅速失控並引入了細微的錯誤和約束。 – Zac

+0

我想這取決於你的論點有多複雜。對於簡單的[開關值]類型的參數,我從來沒有遇到過問題。 –