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

如何在C中编写可选命令行参数的代码,c,command-line-arguments,C,Command Line Arguments,我的程序必须接受可选的命令行参数,其中有1个或3个参数(可执行文件、行数、列数)。如果argc不是3,我们必须创建一个10x10的板(我已经创建了一个创建板的函数) 我不知道该怎么解释。对main.c的一个限制是,我们只允许声明/分配变量和调用函数,所以我一直在想应该如何实现这一点。我最初的想法是编写一个函数correctNumOfArgs来检查argc是否为3,然后返回true或false。然后,我将在另一个函数中使用该结果来确定如何创建电路板,但这仍然需要我在函数中传递argv[1]和arg

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


我不知道该怎么解释。对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
确定行/列。