【发布时间】:2011-01-21 02:49:06
【问题描述】:
在我目前学习的数据结构课程中,我们的任务是用 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 块检查到底是什么?
编辑: 我已经按照所选答案的 cmets 中提供的推理进行了处理,即可能故意导致 argv[0] 变为 NULL,或者基于其他方式变为 NULL main 的特定于平台的实现。
【问题讨论】:
-
注意
argv不是一个数组,而是一个指针。这意味着您完全可以说argv++来遍历选项。您不必修改*argv的值。 -
出于好奇,你问教授的原因是什么?
-
现在,5年后,恐怕我真的不记得了。我似乎隐约记得问我的助教,推理与接受答案的 cmets 相同(请参阅问题中的编辑),但我可能是在编造,只是记住了所有错误。 :P
-
我知道这已经很晚了,但请注意,您可以使用getopt() 轻松解析命令行选项。
-
不确定是否有必要将此标记为重复,因为在链接的“重复”之前 3 个月提出并回答了此问题。 (实际上是 7 年前的那个时候>_>)