Ответ 1
argc
предоставит вам количество переданных аргументов командной строки. Вам не нужно проверять содержимое argv
тоже, если недостаточно аргументов.
if (argc <= 1) { // The first arg will be the executable name
// print usage
}
В классе структур данных, который я сейчас принимаю, нам было поручено написать веб-искатель на С++. Чтобы дать нам начало, профессор предоставил нам программу для получения источника из заданного 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 на основе специфичная для платформы реализация основного.
argc
предоставит вам количество переданных аргументов командной строки. Вам не нужно проверять содержимое argv
тоже, если недостаточно аргументов.
if (argc <= 1) { // The first arg will be the executable name
// print usage
}
3.6.1/2:
Если argc отличен от нуля, эти аргументы должны быть предоставлены в argv [0], хотя... и argv [0] должен быть указателем к начальному характеру NTMBS который представляет собой имя, используемое для вызывать программу или "". Значение
argc
должен быть неотрицательным. Значение ofargv[argc]
должно быть 0.
Акцент мой. argc гарантируется только неотрицательным, а не отличным от нуля.
Это при входе в основное. Также возможно, что //do stuff
изменяет значение argv
или содержимое массива, на которое он указывает. Это не совсем неслыханно для того, чтобы код обработки опции смещал значения с argv по мере их обработки. Поэтому тест *argv == null
может быть проверен, остались ли какие-либо аргументы командной строки после того, как параметры были удалены или пропущены. Вам придется посмотреть на остальную часть кода.
Помня, насколько портативен C, он может не всегда работать на стандартной платформе, такой как Windows или Unix. Возможно, это какой-то микрокод внутри вашей стиральной машины работает на какой-то дешевой, взломанной среде. Таким образом, хорошая практика - убедиться, что указатель не равен нулю, прежде чем разыгрывать его, что могло привести к этому вопросу.
Тем не менее, вы правы. * argv совпадает с argv [0], и argv предполагается инициализироваться средой, если она предусмотрена.
просто спекуляция.
что, если ваш профессор ссылается на это?
while(*++argv !=NULL)
printf("%s\n",*argv);