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

Sha*_*man 11 c c++ null program-entry-point argv

在我目前正在进行的数据结构类中,我们的任务是使用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);
}
Run Code Online (Sandbox Code Playgroud)

其中"选项"已用argv [1]中的开关填充,而argv [2]和更高版本具有剩余参数.我理解的第一个块就好了,如果开关等于字符串做什么基于开关.我想知道最后一个if块的目的是什么.

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

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

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

Ste*_*sop 11

3.6.1/2:

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

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

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


Meh*_*ari 10

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

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

  • @Shaun:是的,`*argv`与`argv [0]`相同.当您从普通shell运行应用程序时,这通常是不可能的.但我认为*如果您通过使用`exec`系统调用直接从另一个程序执行进程并手动传递数组,则可能. (3认同)
  • @Shaun:也许你的教授......错了? (2认同)
  • @Shaun,程序可能会增加`argv`,所以它现在指向空指针.见@史蒂夫的回答. (2认同)