Зачем проверять (* argv == NULL)?

В классе структур данных, который я сейчас принимаю, нам было поручено написать веб-искатель на С++. Чтобы дать нам начало, профессор предоставил нам программу для получения источника из заданного 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.

Может быть, мой С++ несколько ржавый, но я, похоже, вспоминаю, что argv эквивалентен argv [0], в основном это означает, что он проверяет наличие аргументов. Кроме того, у меня создалось впечатление, что argv [0] всегда (по крайней мере, в большинстве реализаций) содержал имя запускаемой программы. Мне кажется, что argv [0] может быть нулевым, если argc равно 0, но при поиске в Google я не смог найти ни одного сообщения, определяющего, возможно ли это.

И поэтому я обращаюсь к вам. Что именно такое окончательное, если проверка блока?

РЕДАКТИРОВАТЬ:. Я пришел к рассуждениям, приведенным в комментариях к выбранному ответу, что может быть возможно преднамеренно привести к тому, что argv [0] станет NULL или иначе станет NULL на основе специфичная для платформы реализация основного.

Ответ 1

argc предоставит вам количество переданных аргументов командной строки. Вам не нужно проверять содержимое argv тоже, если недостаточно аргументов.

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

Ответ 2

3.6.1/2:

Если argc отличен от нуля, эти аргументы должны быть предоставлены в argv [0], хотя... и argv [0] должен быть указателем к начальному характеру NTMBS который представляет собой имя, используемое для вызывать программу или "". Значение argc должен быть неотрицательным. Значение of argv[argc] должно быть 0.

Акцент мой. argc гарантируется только неотрицательным, а не отличным от нуля.

Это при входе в основное. Также возможно, что //do stuff изменяет значение argv или содержимое массива, на которое он указывает. Это не совсем неслыханно для того, чтобы код обработки опции смещал значения с argv по мере их обработки. Поэтому тест *argv == null может быть проверен, остались ли какие-либо аргументы командной строки после того, как параметры были удалены или пропущены. Вам придется посмотреть на остальную часть кода.

Ответ 3

Помня, насколько портативен C, он может не всегда работать на стандартной платформе, такой как Windows или Unix. Возможно, это какой-то микрокод внутри вашей стиральной машины работает на какой-то дешевой, взломанной среде. Таким образом, хорошая практика - убедиться, что указатель не равен нулю, прежде чем разыгрывать его, что могло привести к этому вопросу.

Тем не менее, вы правы. * argv совпадает с argv [0], и argv предполагается инициализироваться средой, если она предусмотрена.

Ответ 4

просто спекуляция.

что, если ваш профессор ссылается на это?

while(*++argv !=NULL)

    printf("%s\n",*argv);