int main (int argc, char * argv []) - PullRequest
       14

int main (int argc, char * argv [])

4 голосов
/ 07 марта 2011

Если у меня есть это:

int main(int argc, char *argv[])

В теле иногда можно найти программы, использующие argv[1].

Когда мы используем argv[1] сверх argv[0]?Только когда мы хотим прочитать аргумент second в командной строке?

Ответы [ 7 ]

12 голосов
/ 07 марта 2011

По соглашению , argv[0] - это имя текущей программы (или путь), а от argv[1] до argv[argc - 1] - аргументы командной строки что пользователь предоставляет.

Однако это не имеет , чтобы быть правдой - программы могут специфичные для ОС функции, чтобы обойти это требование, и это случается достаточно часто, что вы должны бытьосознавать это.(Хотя я не уверен, что вы многое можете сделать, даже если знаете об этом ...)

Пример:

gcc -O3 -o temp.o "My file.c"

даст (должен) произвести следующееаргументы:

argc: 5
argv: ["gcc", "-O3", "-o", "temp.o", "My file.c"]

То есть argv[0] будет означать gcc, , а не до -O3.

5 голосов
/ 07 марта 2011

argv - это массив указателей, и каждый указатель в этом массиве хранит один аргумент из командной строки. Таким образом, argv[0] является первым аргументом (то есть самой исполняемой программой / программой), argv[1] является вторым аргументом и так далее!

Общее количество аргументов определяется argc.

3 голосов
/ 07 марта 2011

Предположим, ваш исполняемый файл C ++ :

/home/user/program (или C:\program.exe в Windows)

, если вы выполните:

./home/user/program 1 2 (или C:\program.exe 1 2 в Windows)

argv[0] = /home/user/program (C:\program.exe)
argv[1] = 1
argv[2] = 2

Это потому что:

  • argv[0] - это путь к исполняемому файлу
  • argv[1] - это первый аргумент

Редактировать:

Теперь я вижу, что argv[0] не обязательно путь к исполняемому файлу.
Прочитайте следующий вопрос SO: Гарантируется ли args [0] путь выполнения?

2 голосов
/ 07 марта 2011

argv [0] - путь выполнения программы, argv [1] - первый параметр программы

0 голосов
/ 07 марта 2011

, поскольку argv [0] - это путь к файлу самой программы. Дополнительные параметры командной строки находятся в следующих индексах, argv [1], argv [2] .. Вы можете прочитать больше здесь : http://www.site.uottawa.ca/~lucia/courses/2131-05/labs/Lab3/CommandLineArguments.html

0 голосов
/ 07 марта 2011

Краткий ответ - да, массив содержит все параметры, переданные в программу.

0 голосов
/ 07 марта 2011

Да, это в основном все, argv[1] - второй параметр командной строки.Первый параметр командной строки - это имя самой программы.

В качестве альтернативы, чтобы избежать семантического беспорядка, который изначально имел этот ответ, и комментариев от других, может иметь смысл назвать argv [0] как *Параметр 1004 * zeroth , так что argv[1] теперь будет «первым» из введенных пользователем значений.

В любом случае это происходит из семейства функций exec(), например execl который использует:

 int execl(const char *path, const char *arg0, ... /*, (char *)0 */);

В оболочке (Unix) при вводе команды, если необходимо, оболочка сначала разрешает имя команды (используя $PATH), чтобы найти реальный абсолютный путь.(Абсолютный или относительный) путь указывается для path, а команда, введенная изначально, указывается как arg0, в конечном итоге в вашей программе она становится argv[0].

Осталось параметры командной строки затем заканчиваются на argv[1] и т. Д.

...