在我目前正在进行的数据结构类中,我们的任务是使用C ++编写Web爬虫。为了给我们一个良好的开端,教授为我们提供了一个程序,用于从给定的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]可能为null,但在Google上搜索我无法找到确定是否可能的单个帖子。
所以我转向你。如果阻止检查,那究竟是什么?
编辑:我已经使用了所选答案的评论中提供的推理,有意可能导致argv [0]变为NULL,或者基于此变为NULL main的特定于平台的实现。
答案 0 :(得分:10)
3.6.1 / 2:
如果argc非零那些参数 但应在argv [0]中提供 ......而argv [0]应该是指针 到NTMBS的初始特征 代表用于的名称 调用程序或“”。的价值
argc
应为非负。价值argv[argc]
的值应为0。
强调我的。 argc只保证非负,而不是非零。
这是在主要的入口。 //do stuff
也可能修改argv
的值或它指向的数组的内容。选项处理代码在处理它们时将值移出argv并不是闻所未闻。因此,*argv == null
的测试可能会在删除或跳过选项后测试是否还有任何命令行参数。您必须查看其余代码。
答案 1 :(得分:9)
argc
将为您提供传递的命令行参数的数量。你不应该检查argv
的内容,看看是否有足够的参数。
if (argc <= 1) { // The first arg will be the executable name
// print usage
}
答案 2 :(得分:4)
记住C的可移植性,它可能并不总是在Windows或Unix等标准平台上运行。也许你的洗衣机里面的一些微代码在一些廉价的黑客环境中运行。因此,最好在解除引用之前确保指针不为空,这可能会导致问题。
即使这样,你也是对的。 * argv与argv [0]相同,而argv 假定由环境初始化,如果提供的话。
答案 3 :(得分:4)
只是猜测。
如果你的教授指的是这个怎么办?
while(*++argv !=NULL)
printf("%s\n",*argv);