我在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>>
,但我不能這樣做,因爲我在集羣上運行程序。
我在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>>
,但我不能這樣做,因爲我在集羣上運行程序。
你需要在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
。
不要使用'const char * argv []',只需使用'char * argv []',-1直到修復。 –
@ RichardJ.RossIII現在已經修復。 – dasblinkenlight
現在你得到一個+1 :) –
如果你想使用命令行參數,那麼沒有,你不要使用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
。
我很確定這是'int argc',而不是'size_t'。如我錯了請糾正我。 – Linuxios
@Linuxios:是的,你說得對。一些編譯器允許'size_t',但標準只要求int main()和int main(int,char * [])被接受,其他的都是實現定義的(C++ 98標準無論如何,我總是躺在......) –
您可以使用這種形式的main()
功能得到命令行參數
int main(int argc, char* argv[]) {
}
其中argv[]
數組的值包含您的命令行變量char*
,你將需要轉換爲floats
或doubles
在你的情況
這就是命令行參數是:
#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
}
它會像其他許多人所建議的那樣使用命令行參數,並讓您提供非常一致,乾淨且可擴展的命令行界面。
如果你已經在使用boost,那麼很好,但是我不會在應用程序中加入boost來解析一些簡單的命令行參數。 –
我總是發現參數解析開始很簡單,並隨着工具的增長迅速失控並引入了細微的錯誤和約束。 – Zac
我想這取決於你的論點有多複雜。對於簡單的[開關值]類型的參數,我從來沒有遇到過問題。 –
爲什麼不使用命令行參數(即argv)?當然,你必須稍後將它們轉換爲「double」類型。 – Mahesh