为什么我们在 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 是写防御代码。
argv
和 argc
从 C 语言一开始就在 main 的签名中,argv
列表末尾的 NULL 也是如此。从那时起我看过很多 C 程序,其中几乎 none 依赖于那个 NULL。相反,它们依靠 argc
来控制数组深度,因为它更简单、更可靠。但是,防御性程序员也会寻找 NULL 以及使用 argc
和 getopt()
如果调用次数太多,应该使用 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
传递给它,因为它可能会使用它来形成那种类型的循环。
最近开始学习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 是写防御代码。
argv
和 argc
从 C 语言一开始就在 main 的签名中,argv
列表末尾的 NULL 也是如此。从那时起我看过很多 C 程序,其中几乎 none 依赖于那个 NULL。相反,它们依靠 argc
来控制数组深度,因为它更简单、更可靠。但是,防御性程序员也会寻找 NULL 以及使用 argc
和 getopt()
如果调用次数太多,应该使用 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
传递给它,因为它可能会使用它来形成那种类型的循环。