【问题标题】:How to code for optional command line parameters in C如何在 C 中为可选的命令行参数编码
【发布时间】:2017-12-07 07:08:23
【问题描述】:

我的程序必须接受可选的命令行参数,其中有 1 个或 3 个参数(可执行文件、行数、列数)。如果 argc 不是 3,我们必须创建一个 10x10 的板(我已经创建了一个函数来创建板)。

我不确定如何解释这一点。 main.c 的一个限制是我们只被允许声明/分配变量和调用函数,所以我被困在我应该如何做这件事上。我最初的想法是写一个函数correctNumOfArgs来检查argc是否为3,然后返回true或false。然后,我将使用该结果生成一个不同的函数来确定如何创建板,但这仍然需要我将 argv[1] 和 argv[2] 作为函数中的参数传递,它们甚至可能不存在。我该如何解决这个问题?注意:我查看了有关可选命令行参数的其他问题,他们提出的解决方案比我们所学的更先进。有没有更基本的解决方案?

【问题讨论】:

  • 显示代码
  • 您似乎已经知道如何做到这一点 - 使用 argc 检查参数的数量。我们不知道您在实际编写代码时有什么样的“限制”,这是为了学校作业还是什么?
  • 编写一个函数只是为了检查argc 对我来说似乎有点矫枉过正.. 只需检查main 中的argc ... if (argc==1){ create_board(10, 10); } else if (argc==3) { create_board(atoi(argv[1]), atoi(argv[2]); }else{ printError} ... return 0;
  • 虽然也许它回避了问题的精神,但似乎你需要做的就是让main()调用一个不受相同限制的main_real()函数,通过argcargv 给它。
  • @yano 很抱歉没有更好地措辞。我的问题是我试图在将 argv 作为参数传递之前拆分它,而我应该只是传递整个内容并访问函数中的不同元素,如下面的答案所示。谢谢

标签: c command-line-arguments


【解决方案1】:

您可以将argcargv 都传递给函数并让它返回行和列。

int main(int argc, char **argv) {
    int rows = 10, cols = 10;
    check_args(argc, argv, &rows, &cols);
    return 0;
}

void check_args(int argc, char **argv, int *rows, int *cols) {
    if (argc == 3) {
        *rows = atoi(argv[1]);
        *cols = atoi(argv[2]);
    }
}

【讨论】:

    【解决方案2】:

    对于您不采用的代码路径,参数是否不存在也没关系。

    我的意思:

    if(3==argc)
    make_board(argv[1], argv[2]);
    else if(1==argc)
    make_board("10", "10");
    else
    {
    /*error*/
    }
    

    如果 numArgs 不为 3,则不采用该路径,因此不使用不存在的参数并且永远不会评估。

    【讨论】:

    • 是的,但在 main 中,我们只允许调用函数或声明/分配变量。因此,我需要将 argv[1] 和 argv[2] 作为参数传递给一个不起作用的函数。
    • 所以通过argcargv在函数中,根据argc确定行/列。
    【解决方案3】:

    您可以很容易地使用 三元 运算符来检查是否为 argc > 2,如果是,则将提供的参数转换为 rowscols,否则,使用每个的默认10,例如

    errno = 0;
    
    int rows = argc > 2 ? (int)strtol (argv[1], NULL, 10) : 10,
        cols = argc > 2 ? (int)strtol (argv[2], NULL, 10) : 10;
    
    if (errno) { /* handle error in strtol conversion    */
                 /* (you should also check for overflow) */ }
    

    (注意:在继续之前始终检查转换中的错误 - 您可以将其移至函数并通过检查 nptrendptr 来完全验证 strtol 转换以确保字符被转换,然后将值保存为临时的long值,您可以确保值在INT_MININT_MAX之间(并且合理),然后再分配给rowscols

    如果您必须使用函数,只需将指向rowscols 的指针作为参数传递,然后设置存储在函数内每个相应地址的值。这样你就有了一个简单的函数调用,它可以返回 0/1 来表示成功/失败,并通过作为参数传递的指针更新 rows, cols 的值。

    【讨论】:

      猜你喜欢
      • 2020-04-11
      • 2017-03-01
      • 2015-07-06
      • 2012-10-06
      • 2017-04-04
      • 2012-03-08
      • 1970-01-01
      • 2015-07-05
      相关资源
      最近更新 更多