如何在C中编写可选命令行参数的代码
我的程序必须接受可选的命令行参数,其中有1个或3个参数(可执行文件、行数、列数)。如果argc不是3,我们必须创建一个10x10的板(我已经创建了一个创建板的函数)如何在C中编写可选命令行参数的代码,c,command-line-arguments,C,Command Line Arguments,我的程序必须接受可选的命令行参数,其中有1个或3个参数(可执行文件、行数、列数)。如果argc不是3,我们必须创建一个10x10的板(我已经创建了一个创建板的函数) 我不知道该怎么解释。对main.c的一个限制是,我们只允许声明/分配变量和调用函数,所以我一直在想应该如何实现这一点。我最初的想法是编写一个函数correctNumOfArgs来检查argc是否为3,然后返回true或false。然后,我将在另一个函数中使用该结果来确定如何创建电路板,但这仍然需要我在函数中传递argv[1]和arg
我不知道该怎么解释。对main.c的一个限制是,我们只允许声明/分配变量和调用函数,所以我一直在想应该如何实现这一点。我最初的想法是编写一个函数correctNumOfArgs来检查argc是否为3,然后返回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
传递给函数,并让它返回行和列
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
,如果是,则将提供的参数转换为行
和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) */ }
(注意:继续之前,请始终检查转换中的错误——您可以将其移动到一个函数,并通过对照endptr
检查nptr
以确保字符已转换,然后将该值保存为临时long
值来完全验证转换,您可以确保在分配到行
,列
)之前,值介于INT\u MIN
和INT\u MAX
之间(且合理)
如果必须使用函数,只需将指向行
和cols
的指针作为参数传递,然后设置存储在函数中每个相应地址的值。这样,您就可以通过一个简单的函数调用返回0/1
以获得成功/失败,并通过点E更新行、cols
的值rs作为参数传递。Show code您似乎已经知道如何执行此操作-使用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…返回0;
尽管它可能回避了问题的实质,但似乎您所需要做的就是调用main()
调用main\u real()
函数不受相同的限制,将argc
和argv
传递给它。@yano我很抱歉没有更好地表述它。我的问题是,我试图在将argv作为参数传递之前拆分它,而我本应该传递整个内容并访问函数中的不同元素,如t中所示他回答如下。谢谢。是的,但大体上我们只允许调用函数或声明/分配变量。因此,我需要将argv[1]和argv[2]作为参数传递给一个不起作用的函数。因此,传递argc
和argv
,在函数中,根据argc
确定行/列。