Что означают int argc, char *argv[]?
В многих IDE для C++ и компиляторах, когда они генерируют функцию main, она выглядит следующим образом:
int main(int argc, char *argv[])
Когда я программирую на C++ без использования IDE, просто через командную строку, я пишу:
int main()
без каких-либо параметров. Что это означает, и насколько это важно для моей программы?
5 ответ(ов)
argv и argc — это параметры, с помощью которых аргументы командной строки передаются в main() в C и C++.
argc представляет собой количество строк, на которые указывает argv. На практике это будет на единицу больше, чем количество аргументов, так как практически все реализации добавляют имя программы в начало массива.
Переменные названы argc (количество аргументов) и argv (вектор аргументов) по соглашению, но им можно дать любое допустимое имя идентификатора: int main(int num_args, char** arg_strings) также будет корректным.
Их также можно полностью опустить, используя int main(), если нет необходимости обрабатывать аргументы командной строки.
Попробуйте следующий код:
#include <iostream>
int main(int argc, char** argv) {
std::cout << "Have " << argc << " arguments:\n";
for (int i = 0; i < argc; ++i) {
std::cout << argv[i] << "\n";
}
}
При запуске программы с аргументами ./test a1 b2 c3, вывод будет следующим:
Have 4 arguments:
./test
a1
b2
c3
Этот пример демонстрирует, как вы можете получить доступ к аргументам командной строки и использовать их в своей программе.
argc — это количество аргументов, переданных вашей программе из командной строки, а argv — это массив аргументов.
Вы можете перебрать аргументы, зная их количество, следующим образом:
for(int i = 0; i < argc; i++)
{
// argv[i] — это аргумент на индексе i
}
Таким образом, вы можете получить доступ к каждому аргументу по его индексу, что позволяет обрабатывать их по мере необходимости.
Если вы запускаете свою программу следующим образом (с использованием синтаксиса sh):
myprog arg1 arg2 'arg 3'
Если вы объявили main как int main(int argc, char *argv[]), то (в большинстве сред) ваша main() будет вызвана так:
p = { "myprog", "arg1", "arg2", "arg 3", NULL };
exit(main(4, p));
Однако, если вы объявили main как int main(), она будет вызвана как-то так:
exit(main());
В этом случае аргументы не будут переданы.
Два дополнительных момента, которые стоит отметить:
- Это единственные две стандартные сигнатуры для
main. Если конкретная платформа принимает дополнительные аргументы или другой тип возвращаемого значения, то это является расширением и не должно использоваться в портируемой программе. *argv[]и**argvабсолютно эквивалентны, поэтому вы можете записатьint main(int argc, char *argv[])какint main(int argc, char **argv).
Конечно! Вот перевод на русский в стиле ответа на StackOverflow.com:
int main();
Это простая декларация функции main. Она не принимает аргументы командной строки.
int main(int argc, char* argv[]);
Эта декларация используется, когда вашей программе необходимо принимать аргументы командной строки. Когда программа запускается следующим образом:
myprogram arg1 arg2 arg3
argc, или количество аргументов, будет установлено в 4 (четыре аргумента), а argv, или массив аргументов, будет заполнен указателями на строки "myprogram", "arg1", "arg2" и "arg3". Запуск программы (myprogram) также включается в аргументы!
В качестве альтернативы, вы можете использовать:
int main(int argc, char** argv);
Это также является допустимым вариантом.
Существует еще один параметр, который вы можете добавить:
int main(int argc, char* argv[], char* envp[]);
Параметр envp также содержит переменные окружения. Каждая запись имеет следующий формат:
VARIABLENAME=VariableValue
например:
SHELL=/bin/bash
Список переменных окружения завершается нулем.
ВАЖНО: НИКОГДА не используйте значения argv или envp напрямую в вызовах к system()! Это огромная уязвимость безопасности, так как злоумышленники могут установить переменные окружения на команды командной строки и (возможно) причинить значительный ущерб. В общем, просто не используйте system(). Почти всегда существует более подходящее решение через стандартные библиотеки C.
Параметры функции main представляют собой аргументы командной строки, переданные программе при её запуске. Параметр argc обозначает количество аргументов командной строки, а char *argv[] — это массив строк (указателей на символы), представляющий собой отдельные аргументы, переданные в командной строке.
Влияет ли использование const на параметры функции? Почему это не сказывается на сигнатуре функции?
Почему T не может быть выведен из Template<T>::Type?
Как удалить элемент из std::vector<> по индексу?
`unsigned int` против `size_t`: когда и что использовать?
Какова разница между "new", "malloc" и "calloc" в C++?