【问题标题】:C++ accepting command line argument with "-" symbolC++ 接受带有“-”符号的命令行参数
【发布时间】:2021-07-22 19:41:58
【问题描述】:

我是 C++ 新手,正在尝试读取如下指定的命令行参数。

./helloworld -i input_file -o outputfile -s flag3 -t flag4

我尝试按如下索引对标志进行硬编码

int main(int argc, char *argv[]) {
 // argv[1] corresponds to -i
 // argv[2] corresponds to input_file
 // argv[3] corresponds to -o
 // argv[4] corresponds to outputfile
 // argv[5] corresponds to -s
 // argv[6] corresponds to flag3
 // argv[7] corresponds to -t
 // argv[8] corresponds to flag4

}

然后我意识到可以更改顺序,所以我不能使用硬编码索引,我使用了 unordered_map 将 -i, -o, -s, -t 作为键和 inputfile, outputfile, flag3, flag4 作为值。

这很好,但我想知道有没有更好的方法来做同样的事情。

【问题讨论】:

  • 使用命令行解析器库。
  • 有许多现有的库处理解析命令行参数和选项。例如Boost program options。如果您已经在使用不同的框架,那么看看它是否有什么东西。或者,如果您使用的是 POSIX 系统(例如 Linux 或 macOS),您可以使用 getopt
  • 我觉得你的方式不错。

标签: c++ c++11 command-line-arguments


【解决方案1】:

天哪。好的,您可以手动执行此操作,我将向您展示一些代码。但请查看 getopt()。它已经对你有所帮助,但需要一点时间来适应。

但您可以手动编写代码:

int index = 1;
while (index < argc) {
    string cmnd = argv[index++];
    if (cmnd == "-i") {
        if (index >= argc) {
            usage();   // This should provide help on calling your program.
            exit(1);
        }
        inputFileName = argv[index++];
    }
    else if (cmnd == "-whatever") {
        // Continue to process all your other options the same way
    }
}

现在,这不是任何人这样做的方式。我们使用一些版本的 getopt()。我相信还有一个我喜欢的叫getopt_long。你会想挖这样的东西。然后我把所有这些都放在我自己的包装上,这样我就可以做一些非常酷的事情了。

如果您想查看我使用的包装器:https://github.com/jplflyer/ShowLib.git 并查看 OptionHandler.h 和 .cpp。它太酷了。我认为有一个如何在某处使用它的示例。

但是您需要知道它在底层是如何工作的,因此对于您的第一个程序,也许可以像我向您展示的那样手动执行。

【讨论】:

    【解决方案2】:

    您可以使用 3rdparty 库来解析命令行参数。
    例如:https://github.com/mirror/tclap

    【讨论】:

      猜你喜欢
      • 2013-11-24
      • 1970-01-01
      • 1970-01-01
      • 2017-06-25
      • 2011-08-23
      • 1970-01-01
      • 1970-01-01
      • 2013-03-15
      • 1970-01-01
      相关资源
      最近更新 更多