为什么我们在 getopt() 函数中使用 argc 作为参数?

Why we use argc as argument in getopt() function?

最近开始学习C语言,对C语言的功能了解不多

最近在网上看到一篇用C写的程序的文章。是这样的:-

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
    int i = 0;
    int j = 0;
    char ch;

    ch = getopt(argc, argv, "n:");
    if(ch == 'n')
    {
        j = atoi(optarg);
    }

    while(j--)
    {
        printf("%i\n",j);
    }
    return 0;
}

谁能说出 getopt() 函数中 argc 的实际用途是什么?它是否使用 argc 至于它应该在哪里读取选项?

据我观察,argc 是写简单代码,argv NULL 是写防御代码。

argvargc 从 C 语言一开始就在 main 的签名中,argv 列表末尾的 NULL 也是如此。从那时起我看过很多 C 程序,其中几乎 none 依赖于那个 NULL。相反,它们依靠 argc 来控制数组深度,因为它更简单、更可靠。但是,防御性程序员也会寻找 NULL 以及使用 argcgetopt() 如果调用次数太多,应该使用 argc 来抱怨。

此外,我还看到玩游戏的代码可以重复使用 getopt() 来解析辅助 "command lines" 以获取提供给应用程序的命令。并非所有这些都将 NULL 放在列表的末尾(尽管我的)。

C 标准确实保证 argv[argc] 是一个 NULL 指针:

C 标准,§5.1.2.2.1.2:

If they are declared, the parameters to the main function shall obey the following constraints:

...

— argv[argc] shall be a null pointer.

从技术上讲,您(和函数 getopt)真正需要的是 argv - 这样的事情将处理所有参数:

int i;
for(i = 0; argv[i]; i++)
{
    puts(argv[i]);
}

但是,没有什么可以阻止您(或 getopt 的作者)使用 argc 作为环路保护。这同样有效:

int i;
for(i = 0; i < argc; i++)
{
    puts(argv[i]);
}

因此,如果函数说它需要传递 argc,则将 argc 传递给它,因为它可能会使用它来形成那种类型的循环。