如何在 C 中编写可选命令行参数的代码

How to code for optional command line parameters in C

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

我不确定如何解释这一点。 main.c 的一个限制是我们只允许 declare/assign 变量和调用函数,所以我坚持我应该如何完成这项工作。我最初的想法是编写一个函数 correctNumOfArgs 来检查 argc 是否为 3,然后 return true 或 false。然后我会在不同的函数中使用该结果来确定如何创建板,但这仍然需要我将 argv[1] 和 argv[2] 作为函数中的参数传递,它们甚至可能不存在。我该如何解决这个问题?注意:我查看了有关可选命令行参数的其他问题,他们建议的解决方案比我们所学的更高级。有更基本的解决方案吗?

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

我的意思是:

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

如果 numArgs 不是 3,则不采用该路径,因此不使用也不评估不存在的参数。

您可以将 argcargv 都传递给一个函数,并使其具有 return 行和列。

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]);
    }
}

您可以使用 三元 运算符通过变量赋值来轻松完成此操作,以检查是否 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) */ }

(注意: 在继续之前始终检查转换中的错误——您可以将其移至函数并通过检查 nptr 反对 endptr 以确保字符被转换,然后将值保存为临时 long 值,您可以确保值在 INT_MININT_MAX 之间(并且reasonable) 在分配给 rows, cols)

之前

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