从命令行输入

8

我有一个用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>>,但我不能这样做,因为我在一个集群上运行程序。


为什么不使用命令行参数(即argv)?当然,您稍后必须将它们转换为“double”类型。 - Mahesh
5个回答

22
你需要在你的main函数中使用命令行参数
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[],直到修复为止。 - Richard J. Ross III
@RichardJ.RossIII 这个问题现在已经解决了。 - Sergey Kalinichenko

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*转换为double


3
我相信应该是 int argc,而不是 size_t。如果我错了请纠正我。 - Linuxios
1
@Linuxios:是的,你说得对。一些编译器允许使用size_t,但标准只要求接受int main()int main(int, char*[]),其他任何形式都是实现定义的(至少根据我手边的C++98标准是这样的...)。 - Ed S.

4
这就是命令行参数的作用所在:
#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程序选项

它会像其他许多建议的那样获取命令行参数,并允许您提供非常一致、清晰和可扩展的命令行界面。


1
如果你已经在使用boost,那很好,但我不会仅仅为了解析几个简单的命令行参数而将boost包含到一个应用程序中。 - Ed S.
1
我一直觉得参数解析开始很简单,但随着工具的发展,很快就会变得复杂,引入微妙的错误和限制。 - Zac
我猜这取决于你的参数有多复杂。对于简单的[switch value]类型的参数,我从来没有遇到过问题。 - Ed S.

0
您可以使用以下形式的main()函数来获取命令行参数。
    int main(int argc, char* argv[]) { 

    } 

在这里,argv[] 数组的值包含了您的命令行变量,它们是 char* 类型的,您需要将它们转换为 floatsdoubles


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接