在我目前正在学习的数据结构课程中,我们的任务是用 C++ 编写一个网络爬虫。为了让我们抢占先机,教授为我们提供了一个从给定 URL 获取源代码的程序,以及一个简单的 HTML 解析器来剥离标签。该程序的 main 函数接受参数,因此使用 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);
}
其中“option”已使用 argv[1] 中的开关填充,argv[2] 及更高版本具有剩余参数。我理解的第一个块很好,如果开关等于字符串,则根据开关执行任何操作。我想知道最后一个 if 块的目的是什么。
可能是我的 C++ 有点生疏,但我似乎记得 *argv 相当于 argv[0],基本上意味着它正在检查以确保参数存在。但我的印象是 argv[0] 总是(至少在大多数实现中)包含正在运行的程序的名称。我发现如果 argc 等于 0,argv[0] 可能为 null,但是在 Google 上搜索我找不到任何帖子来确定这是否可能。
所以我转向你。最终的 if 块检查到底是什么?
EDIT:我已经接受了所选答案的注释中提供的推理,即可能故意导致 argv[0] 变为 NULL,或者基于 main 的特定于平台的实现变为 NULL。
3.6.1/2:
如果 argc 非零那些论点
应在 argv[0] 中提供
...并且 argv[0] 应该是指针
NTMBS 的初始字符
代表所用的名称
调用程序或“”。的价值argc
应为非负数。价值
的argv[argc]
应为 0。
强调我的。 argc 只保证非负数,而不保证非零。
这是 main 的入口。也有可能是//do stuff
修改的值argv
,或者它指向的数组的内容。选项处理代码在处理 argv 时将值移出的情况并非完全闻所未闻。测试为*argv == null
因此,在删除或跳过选项后,可能会测试是否还剩下任何命令行参数。您必须查看其余的代码。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)