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

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

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

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

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

Ответы

Ответ 1

По соглашению, 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.

Ответ 2

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

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

Ответ 3

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

/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] является первым аргументом

Edit:

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

Ответ 4

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

Ответ 5

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

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

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

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

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

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

Ответ 6

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