2010-02-25 2 views
11

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

+3

Обратите внимание, что 'argv' не является массивом, а указателем. Это означает, что вы можете отлично сказать «argv ++» для повторения параметров. Вам не нужно изменять значение '* argv'. –

+0

Из любопытства, в чем причина вашего профессора, когда вы спросили его об этом? – Daniel

+0

Теперь, 5 лет спустя, я боюсь, что я действительно не помню. Кажется, я смутно вспоминаю, спрашивая о своей ТП, и рассуждения совпадают с комментариями принятого ответа (см. EDIT в вопросе), но я мог бы это сделать и просто запомнить все неправильно. : P –

ответ

9

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

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

Я знаю это, код выше - это код, который нам дал наш профессор. Лично я всегда проверяю argc. Я спрашиваю, что такое * argv == NULL на самом деле проверка? Мое впечатление было то, что это то же самое, что проверка argv [0] == NULL, что, насколько я знаю, невозможно, так зачем его проверять? –

+3

@Shaun: Да, '* argv' идентичен' argv [0] '. Обычно это невозможно, если вы используете приложение из обычной оболочки. Но я думаю, что это возможно, если вы выполняете процесс непосредственно из другой программы, используя системный вызов 'exec' и передавая массивы вручную. –

+0

Я думал, что argv [0] всегда содержал имя программы, поэтому, почему нужно проверить, является ли это NULL? –

4

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

Несмотря на это, вы правы. * argv - это то же самое, что и argv [0], а argv - . Предполагается, что будет инициализироваться средой, если это предусмотрено.

+4

«Возможно, это какой-то микро-код внутри вашей стиральной машины». Отлично, теперь я жду сообщения «Извините, вы должны обновить« Adobe Flash »до последней версии, чтобы ввести цикл полоскания». –

+2

Blue Wash of Death: P – MSalters

10

3.6.1/2:

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

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

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

4

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

что, если ваш профессор обращается к этому?

while(*++argv !=NULL) 

    printf("%s\n",*argv); 
Смежные вопросы