如何在 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,则不采用该路径,因此不使用也不评估不存在的参数。
您可以将 argc
和 argv
都传递给一个函数,并使其具有 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
,如果是,则将提供的参数转换为 rows
和 cols
,否则,对每个使用默认值 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_MIN
和 INT_MAX
之间(并且reasonable) 在分配给 rows
, cols
)
之前
如果您必须使用一个函数,只需传递一个指向 rows
和 cols
的指针作为参数,然后设置存储在函数内每个相应地址的值。这样你就有了一个简单的函数调用,可以 return 0/1
for success/failure 并通过作为参数传递的指针更新 rows, cols
的值。
我的程序必须接受可选的命令行参数,其中将有 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,则不采用该路径,因此不使用也不评估不存在的参数。
您可以将 argc
和 argv
都传递给一个函数,并使其具有 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
,如果是,则将提供的参数转换为 rows
和 cols
,否则,对每个使用默认值 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_MIN
和 INT_MAX
之间(并且reasonable) 在分配给 rows
, cols
)
如果您必须使用一个函数,只需传递一个指向 rows
和 cols
的指针作为参数,然后设置存储在函数内每个相应地址的值。这样你就有了一个简单的函数调用,可以 return 0/1
for success/failure 并通过作为参数传递的指针更新 rows, cols
的值。