11

在我目前正在学习的数据结构课程中,我们的任务是用 C++ 编写一个网络爬虫。为了让我们领先一步,教授为我们提供了一个从给定 URL 获取源代码的程序和一个简单的 HTML 解析器来去除标签。该程序的主函数接受参数,因此使用 argc/argv。用于检查参数的代码如下:

// Process the arguments
if (!strcmp(option, "-h"))
{
    // do stuff...
}
else if (!strcmp(option, ""))
{
    // do stuff...
}
else if (!strcmp(option, "-t"))
{
    // do stuff...
}
else if (!strcmp(option, "-a"))
{
    // do stuff...
}

if ( *argv == NULL )
{
    exit(1);
}

其中“选项”已使用 argv[1] 中的开关填充,而 argv[2] 及更高版本具有剩余参数。我理解的第一个块很好,如果开关等于字符串,则根据开关做任何事情。我想知道最后一个 if 块的目的是什么。

可能是我的 C++ 有点生疏,但我似乎记得 *argv 等同于 argv[0],基本上意味着它正在检查以确保参数存在。除了我的印象是 argv[0] 总是(至少在大多数实现中)包含正在运行的程序的名称。我突然想到,如果 argc 等于 0,则 argv[0] 可能为空,但在 Google 上搜索我找不到一个确定这是否可能的帖子。

所以我转向你。最后的 if 块检查到底是什么?

编辑:我已经使用所选答案的评论中提供的推理,即有可能故意导致 argv[0] 变为 NULL,或者基于特定于平台的 main 实现变为 NULL。

4

4 回答 4

12

3.6.1/2:

如果 argc 不为零,则应在 argv[0] 中提供这些参数,尽管 ... 并且 argv[0] 应是指向 NTMBS 的初始字符的指针,该字符表示用于调用程序的名称或“”。的值 argc应为非负数。的值argv[argc]应为 0。

强调我的。argc 只保证非负,而不是非零。

这是在主入口处。也可以//do stuff修改 的值argv,或者它指向的数组的内容。选项处理代码在处理它们时将值移出 argv 并不是完全没有听说过的。因此,测试*argv == null可能是在删除或跳过选项之后测试是否有任何命令行参数。您必须查看其余代码。

于 2010-02-25T17:26:47.427 回答
10

argc将为您提供传递的命令行参数的数量。您不需要检查的内容argv是否没有足够的参数。

if (argc <= 1) { // The first arg will be the executable name
   // print usage
}
于 2010-02-25T17:18:02.190 回答
4

记住 C 语言的可移植性,它可能并不总是在 Windows 或 Unix 等标准平台上运行。也许它是洗衣机内的一些微代码,在一些廉价的黑客环境中运行。因此,在取消引用之前确保指针不为空是一种很好的做法,这可能会导致问题。

即便如此,你是对的。*argv 与 argv[0] 相同,并且 argv应该由环境初始化(如果提供的话)。

于 2010-02-25T17:25:39.897 回答
4

只是一种猜测。

如果您的教授指的是这个怎么办?

while(*++argv !=NULL)

    printf("%s\n",*argv);
于 2010-02-25T17:33:03.007 回答