来自命令行的输入 我有一个C++程序,它运行的是许多参数的值。我想做的是: 假设我有两个参数: int main(){ double a; double b; //some more lines of codes }

来自命令行的输入 我有一个C++程序,它运行的是许多参数的值。我想做的是: 假设我有两个参数: int main(){ double a; double b; //some more lines of codes },c++,command-line-arguments,C++,Command Line Arguments,现在,在我编译之后,我想以 ./output.out 2.2 5.4 因此,a取值2.2,b取值5.4 当然,一种方法是使用cin>,但我不能这样做,因为我在集群上运行程序。您需要在主中使用: int main(int argc, char* argv[]) { if (argc != 3) return -1; double a = atof(argv[1]); double b = atof(argv[2]); ... return 0; } 此代

现在,在我编译之后,我想以

./output.out 2.2 5.4
因此,
a
取值2.2,
b
取值5.4

当然,一种方法是使用
cin>
,但我不能这样做,因为我在集群上运行程序。

您需要在
中使用:

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

此代码使用解析参数;您可以改为使用。

如果您想使用命令行参数,那么不,您不能使用
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
s。

您可以使用
main()
函数的这种形式来获取命令行参数

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

    } 

其中,
argv[]
数组的值包含命令行变量
char*
,您需要将其转换为
浮点值
双倍值
,这就是命令行参数的作用:

#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
}
#包括
int main(int argc,char*argv[])
{
如果(argv<3)
//显示错误
双a,b;
std::string input=argv[1];
std::stringstream ss=std::stringstream(输入);
ss>>a;
输入=argv[2];
ss=std::stringstream(输入);
ss>>b;
//a和b现在都已在应用程序中成功解析
}
你看过吗


它将采用许多其他建议的命令行参数,并让您提供一个非常一致、干净和可扩展的命令行界面。

为什么不使用命令行参数(即argv)?当然,您以后必须将它们转换为
double
类型。我很确定这是
int argc
,而不是
size\u t
。如果我错了,请纠正我。@Linuxios:是的,你是对的。有些编译器允许
size\u t
,但标准只要求接受
int main()
int main(int,char*[])
,其他任何东西都是实现定义的(好吧,反正我已经有了C++98标准…),不要使用
const char*argv[]
,只需使用
char*argv[]
,-1直到修复。@RichardJ.RossIII这现在已经修复。如果您已经在使用boost,那么是的,这很好,但我不会将boost包含到应用程序中,只是为了解析几个简单的命令行参数。我总是发现参数解析一开始很简单,随着工具的发展,很快就会失控,引入微妙的bug和约束。我想这取决于你的论点有多复杂。对于简单的[switch value]类型参数,我从未遇到过问题。