【问题标题】:Variable length and position command line arguments可变长度和位置命令行参数
【发布时间】:2026-01-25 01:20:16
【问题描述】:

所以,快速提问: 我的任务是制作一个读取文件的程序,做一些花哨的事情,并用重新使用的文本写出一个 html 文件,所有这些都是简单的东西。 此外,程序必须能够接受最多四个命令行参数(但最少两个)。当然是可执行文件,它正在读取的文件,它将读取到的文件名,最后是一个“-r”参数以获取有关文件的更多信息(段落数量等)。

所以我的问题如下: “-r”参数可以在参数中的任何位置(当然,只要它在 argv[0] 之后),或者它可以完全不存在(输出文件名也是如此)。

这仍然很简单,写一堆 if 甚至一两个 switch 有点乏味,但我不禁想到可能有更简单的方法来完成这件事,而不是过多的if 语句。

任何帮助将不胜感激。 (我也认为您不需要任何代码,因为我没有完全有问题。)

【问题讨论】:

  • 如果您拥有围绕您的问题的相关代码,那就太好了。请编辑您的问题以包含它。
  • 互联网上到处都有命令行解析选项。找一个你行的并使用它。
  • @AdamZuckerman 问题是,我没有问题,只是一个简单的问题。
  • Boost program options 在这里可能有点矫枉过正。但是你可以试试。 Esier 选项是getopts
  • @Named 谢谢,我已经研究过 Boost 程序选项,但不是 getopts,所以我会研究一下

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


【解决方案1】:

以下是在没有库的情况下大致如何做到这一点:

GCC 4.8.2:g++ -Wall -Wextra -std=c++0x main.cpp

#include <iostream>
#include <string>

int main(int argc, char* argv[]) {
  char* input = nullptr;
  char* output = nullptr;
  char* r_arg = nullptr;
  --argc; ++argv; // Skip the program name.
  const char* def_in = "default in";
  const char* def_out = "default out";
  const char* def_r = "default r";

  while (0 < argc) {
    if (std::string(argv[0]) == "-r") {
      // This code requires a space after the "-r", which is unusual.
      ++argv;
      --argc;
      r_arg = argv[0]; }
    else if (input == nullptr) {
      input = argv[0]; }
    else if (output == nullptr) {
      output = argv[0]; }
    else {
      std::cerr << "error: unexpected arg '" << argv[0] << "'\n"; }

    ++argv;
    --argc; }

  if (input == nullptr) {
    input = const_cast<char*>(def_in); }

  if (output == nullptr) {
    output = const_cast<char*>(def_out); }

  if (r_arg == nullptr) {
    r_arg = const_cast<char*>(def_r); }

  std::cout << "input: " << input << "\n"
            << "output: " << output << "\n"
            << "r arg: " << r_arg << "\n";
  return 0; }

【讨论】:

    最近更新 更多