7

Что означают int argc, char *argv[]?

26

В многих IDE для C++ и компиляторах, когда они генерируют функцию main, она выглядит следующим образом:

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

Когда я программирую на C++ без использования IDE, просто через командную строку, я пишу:

int main()

без каких-либо параметров. Что это означает, и насколько это важно для моей программы?

5 ответ(ов)

8

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

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

0

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

Вы можете перебрать аргументы, зная их количество, следующим образом:

for(int i = 0; i < argc; i++)
{
    // argv[i] — это аргумент на индексе i
}

Таким образом, вы можете получить доступ к каждому аргументу по его индексу, что позволяет обрабатывать их по мере необходимости.

0

Если вы запускаете свою программу следующим образом (с использованием синтаксиса 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());

В этом случае аргументы не будут переданы.

Два дополнительных момента, которые стоит отметить:

  1. Это единственные две стандартные сигнатуры для main. Если конкретная платформа принимает дополнительные аргументы или другой тип возвращаемого значения, то это является расширением и не должно использоваться в портируемой программе.
  2. *argv[] и **argv абсолютно эквивалентны, поэтому вы можете записать int main(int argc, char *argv[]) как int main(int argc, char **argv).
0

Конечно! Вот перевод на русский в стиле ответа на 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.

0

Параметры функции main представляют собой аргументы командной строки, переданные программе при её запуске. Параметр argc обозначает количество аргументов командной строки, а char *argv[] — это массив строк (указателей на символы), представляющий собой отдельные аргументы, переданные в командной строке.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь