2012-07-03 87 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

我想这取决于你的论点有多复杂。对于简单的[开关值]类型的参数,我从来没有遇到过问题。 –