В классе структур данных, который я сейчас принимаю, нам было поручено написать веб-искатель в C++. Чтобы дать нам начало, профессор предоставил нам программу для получения источника из заданного URL-адреса и простого анализатора HTML, чтобы удалить теги. Основная функция для этой программы принимает аргументы и поэтому использует argc/argv. Код, используемый для проверки аргументов заключается в следующем:Зачем проверять (* argv == NULL)?
// 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] всегда (по крайней мере, в большинстве реализаций) содержал имя запускаемой программы. Мне кажется, что argv [0] может быть нулевым, если argc равно 0, но при поиске в Google я не смог найти ни одного сообщения, определяющего, возможно ли это.
И поэтому я обращаюсь к вам. Что именно такое окончательное, если проверка блока?
EDIT: Я пошел с доводами, представленных в комментариях выбранного ответа, что это может быть возможно, намеренно вызвать ARGV [0], чтобы стать NULL, или в противном случае становится NULL на основе платформы конкретного реализация основных.
Обратите внимание, что 'argv' не является массивом, а указателем. Это означает, что вы можете отлично сказать «argv ++» для повторения параметров. Вам не нужно изменять значение '* argv'. –
Из любопытства, в чем причина вашего профессора, когда вы спросили его об этом? – Daniel
Теперь, 5 лет спустя, я боюсь, что я действительно не помню. Кажется, я смутно вспоминаю, спрашивая о своей ТП, и рассуждения совпадают с комментариями принятого ответа (см. EDIT в вопросе), но я мог бы это сделать и просто запомнить все неправильно. : P –