Если у меня есть это:
int main(int argc, char *argv[])
В теле вы можете иногда находить программы, используя argv[1]
.
Когда мы используем argv[1]
над argv[0]
? Это только когда мы просто хотим прочитать второй аргумент в командной строке?
Если у меня есть это:
int main(int argc, char *argv[])
В теле вы можете иногда находить программы, используя argv[1]
.
Когда мы используем argv[1]
над argv[0]
? Это только когда мы просто хотим прочитать второй аргумент в командной строке?
По соглашению, 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
.
argv
- это массив указателей, и каждый указатель в этом массиве сохраняет один аргумент из командной строки. Итак, argv[0]
- это первый аргумент (то есть сам исполняемый файл/программа), argv[1]
- второй аргумент и т.д.!
Общее количество аргументов определяется argc
.
Предположим, что ваш исполняемый файл С++:
/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] гарантией того, что это путь выполнения?
argv [0] - путь выполнения программы, argv [1] - первый параметр для программы
Да, в основном это, 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]
и т.д.
Короткий ответ - да, массив содержит все параметры, переданные в программу.
как argv [0] - путь к файлу самой программы. Дополнительные параметры командной строки находятся в дополнительных индексах, argv [1], argv [2]. Вы можете прочитать больше здесь: http://www.site.uottawa.ca/~lucia/courses/2131-05/labs/Lab3/CommandLineArguments.html