120

似乎argv[argc]总是NULL,所以我认为我们可以在没有 的情况下遍历参数列表argc。一个while循环将执行此操作。

NULL如果末尾总是有一个argv,为什么我们需要一个argc

4

5 回答 5

107

是的,argv[argc]==NULL有保证。见C11 5.1.2.2.1 程序启动(我的重点)

如果它们被声明,主函数的参数应遵守以下约束:

argc 的值应为非负数。 argv[argc] 应该是一个空指针。

因此,提供argc并不重要,但仍然有用。除此之外,它还允许快速检查是否传递了正确数量的参数。

编辑:问题已被修改为包括 C++。n3337 草案3.6.1 主要功能

2 ...argc 应该是从程序运行的环境传递给程序的参数数量。.... argc 的值应为非负数。argv[argc] 的值应为 0

于 2013-08-31T10:28:10.420 回答
43

是的,argv[argc]保证是空指针。argc用于方便。

引用 C99 Rationale 的官方解释,注意冗余检查

国际标准的基本原理 - 编程语言 - C §5.1.2.2.1程序启动

规范argcargv作为论据main承认广泛的先前实践。argv[argc]要求为空指针,以提供对链表结尾的冗余检查,也是基于惯例。

于 2013-08-31T12:53:11.237 回答
19

这是出于历史原因,以及与旧代码的兼容性。最初,不能保证存在一个空指针作为 argv 数组的最后一个元素。但是argc一直存在。

于 2013-08-31T12:31:57.667 回答
6

我们“需要”它,因为各种标准都要求它。

我们可以完全忽略该值,但由于它是 的第一个参数main,我们必须将它放在参数列表中。在 C++(可能还有非标准 C 方言)中,您可以省略参数名称,就像这个 C++ 片段(易于转换为 C):

#include <stdio.h> // C-compatible include, guarantees puts in global namespace

// program will print contents of argv, one item per line, starting from argv[0]

int main(int /*argc*/, char *argv[]) { // uncomment argc for C

    //(void)argc; // uncomment statement for C

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

    return 0;
}

在标准 C 中,具有常见的警告设置,未使用的参数会生成警告,可以通过类似(void)argc;这样的语句来修复,该语句会导致使用名称而不生成任何代码。

argc很好,因为否则许多程序需要遍历参数才能获得计数。此外,在许多具有长度数组的编程语言中,没有任何argc参数,只有一个包含项目的数组。

于 2013-09-01T08:55:01.323 回答
0
  • 如果需要从输入列表中访问最后一个参数,则使用起来argv[argc - 1]比循环更方便。
  • 最好(更简洁)argc提供给我,而不是编写代码,当逻辑需要我时(并且在某些情况下可能发生这种情况),将分别给我计数。
于 2021-08-15T21:05:09.523 回答