Обработка 'argv' в программе командной строки C

Я считал первого члена массива argv всегда будет название программы.

Когда-либо полезно держаться за это? Я учусь, поэтому простите мне, если это - немой вопрос.

Сделайте люди когда-либо не смещают первого участника, потому что это бесполезно (и сброс argv быть тем меньше?), или оставляет его там лучшей практикой, потому что люди ожидают, что это всегда будет там (и для него для работы из поля с argc) ?

7
задан alex 10 August 2010 в 01:44
поделиться

6 ответов

Я читал, что первым членом массива argv всегда будет имя программы.

Это должно быть . И C, и C ++ требуют, чтобы, если argc больше нуля, argv [0] было либо именем программы, либо пустой строкой.

Некоторые системы не обязательно соблюдают это соглашение во всех случаях (например, в Windows можно использовать CreateProcess для создания нового процесса и не передавать имя программы в используемых аргументах командной строки. для заполнения argc и argv ).

Будет ли полезно держаться за это?

Конечно. Если вы хотите создать другой экземпляр себя, например, или если вы хотите распечатать имя своей программы (например, в инструкциях по использованию).

Убирают ли люди смену первого члена, потому что он бесполезен, или оставляют его там - это лучшая практика?

Не меняйте фактические аргументы; следующий человек, который придет, вероятно, будет ожидать, что они будут в их первоначальной форме.

7
ответ дан 6 December 2019 в 11:45
поделиться

Если быть точным, argv[0] - это то, что передается в exec(2), что условно является именем программы, но может быть чем угодно.

Не сдвигайте его, потому что от него зависит слишком много скрытых зависимостей.

4
ответ дан 6 December 2019 в 11:45
поделиться

Первый аргумент - это не всегда имя программы - это зависит от того, как она вызывается (см. здесь ).

Часто argv [0] используется в тексте справки:

fprintf(stderr, "Usage: %s <foo> [bar]\n", argv[0]);

Сдвиг массива не очень полезен и неэффективен. Вы также можете просто начать использовать argv с индекса 1.

3
ответ дан 6 December 2019 в 11:45
поделиться

Ожидается, что argv [0] всегда будет содержать имя исполняемого файла.Из-за этого вы никогда не должны удалять его.

Что касается полезности, argv [0] можно использовать, если вы хотите, чтобы ваше приложение изменяло поведение в зависимости от того, как оно было вызвано.

Busybox , например, использует это во встроенных системах Linux. Обычно у вас будет одна копия исполняемого файла и создать символические ссылки на исполняемый файл с разными именами. например. cp, rm, ls и т. д. Затем Busybox определяет, какую функцию выполнять, на основе содержимого argv [0].

3
ответ дан 6 December 2019 в 11:45
поделиться

Из ISO C99, §5.1.2.2.1,

Если значение argc больше нуля, строка, на которую указывает argv [0], представляет имя программы; argv [0] [0] должен быть нулевым символом, если имя программы недоступно из среды хоста.

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

0
ответ дан 6 December 2019 в 11:45
поделиться

содержимое argv [0] не определено ANSI. argv можно перечислить:

main(int argc,char**argv)
{
  while( argc-- )
    puts(*argv++);
  return 0;
}
0
ответ дан 6 December 2019 в 11:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: