代码之家  ›  专栏  ›  技术社区  ›  Shaun Hamman

为什么要检查if(*argv==null)?[复制品]

  •  11
  • Shaun Hamman  · 技术社区  · 16 年前

    这个问题已经有了答案:

    在我目前正在使用的数据结构类中,我们已经完成了在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);
    }
    

    其中“option”已填充argv[1]中的开关,argv[2]及更高版本具有其余参数。我理解的第一个块很好,如果开关等于字符串,就根据开关做任何事情。我想知道最后一个if块的目的是什么。

    可能是我的C++有点生疏,但我似乎记得AGV相当于ARVV(0),基本上意味着它正在检查以确定参数是否存在。但我的印象是argv[0]始终(至少在大多数实现中)包含正在运行的程序的名称。我突然想到,如果argc等于0,argv[0]可能为空,但在google上搜索时,我找不到一篇文章来确定这是否可能。

    所以我转向你。最后一个if块检查是什么?

    编辑: 我已经解释了所选答案的注释中提供的推理,即根据main的平台特定实现,可能会故意使argv[0]变为空,或者以其他方式变为空。

    4 回复  |  直到 14 年前
        1
  •  9
  •   Mehrdad Afshari    16 年前

    argc 将提供传递的命令行参数数。你不需要检查 argv 也看看是否没有足够的论据。

    if (argc <= 1) { // The first arg will be the executable name
       // print usage
    }
    
        2
  •  10
  •   Steve Jessop    16 年前

    3.61/2:

    如果argc为非零 那些论点 但应在argv[0]中提供 …argv[0]是指针 到ntmbs的初始字符 代表过去 调用程序或。价值 argc 应该是非负的。价值 属于 argv[argc] 应为0。

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

    这是主入口。也有可能 //do stuff 修改的值 argv ,或它指向的数组的内容。选项处理代码在处理argv时将其值从argv中移开并非完全没有听说过。测试 *argv == null 因此,在删除或跳过选项后,可能正在测试是否还有任何命令行参数。你得看看剩下的代码。

        3
  •  4
  •   Walt Stoneburner    16 年前

    记住c的可移植性,它可能并不总是在windows或unix这样的标准平台上运行。也许是你洗衣机里的一些微代码运行在一个便宜的黑客环境中。因此,在取消对指针的引用之前,最好确保指针不为空,这可能会导致问题的产生。

    即便如此,你是对的。*argv与argv[0]相同,argv是 想象上的 由环境初始化(如果提供)。

        4
  •  4
  •   Rozuur    16 年前

    只是个猜测。

    如果你的教授指的是这个呢??

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