c++ - 为什么要检查 if (*argv == NULL)?

标签 c++ c null program-entry-point argv

<分区>

在我目前正在学习的数据结构类(class)中,我们的任务是用 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] 和更高版本具有剩余参数。我理解的第一个 block 很好,如果开关等于字符串,则根据开关执行任何操作。我想知道最后一个 if block 的目的是什么。

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

所以我转向你。 final if block 检查到底是什么?

编辑: 我已经采用了所选答案的评论中提供的推理,即有可能故意导致 argv[0] 变为 NULL,或以其他方式变为 NULL,基于main 的特定于平台的实现。

最佳答案

3.6.1/2:

If argc is non-zero those arguments shall be provided in argv[0] though ... and argv[0] shall be the pointer to the initial character of a NTMBS that represents the name used to invoke the program or "". The value of argc shall be nonnegative. The value of argv[argc] shall be 0.

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

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

关于c++ - 为什么要检查 if (*argv == NULL)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2336027/

相关文章:

Java - 给空对象的字段一个值或声明没有构造函数的对象不为空

c++ - 聚丙稀 | .h 文件 (C++)

c++ - 使用成员函数启动线程

c# - 在调试托管代码时调试非托管代码

c - 选择阻止 fifo 读取

c++ - 猜数字游戏

c - 无法使用 GDB 找到堆栈粉碎功能

复制一个 3 dim 数组本身

java - JBoss 5.1.0GA "user null is NOT authenticated"问题