我在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