为什么检查是否(* argv == NULL)?

在我目前正在使用的数据结构类中,我们的任务是使用C ++编写Web爬虫。 为了给我们一个良好的开端,教授为我们提供了一个程序,用于从给定的URL获取源代码,并使用简单的HTML解析器来剥离标记。 该程序的主要function接受参数,因此使用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上搜索我找不到确定是否可能的单个post。

所以我转向你。 如果块检查,那究竟是什么?

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

argc将为您提供传递的命令行参数的数量。 你不应该检查argv的内容,看看是否有足够的参数。

 if (argc <= 1) { // The first arg will be the executable name // print usage } 

3.6.1 / 2:

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

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

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

记住C的可移植性,它可能并不总是在Windows或Unix等标准平台上运行。 也许你的洗衣机里面的一些微代码在一些廉价的黑客环境中运行。 因此,在解除引用之前确保指针不为空是一个好习惯,这可能会导致问题。

即使这样,你也是对的。 * argv与argv [0]相同,argv 应该由环境初始化,如果提供的话。

只是猜测。

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

 while(*++argv !=NULL) printf("%s\n",*argv);