Что означает int argc, char * argv []? - PullRequest
458 голосов
/ 11 июня 2010

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

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

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

int main()

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

Ответы [ 8 ]

592 голосов
/ 11 июня 2010

argv и argc - как аргументы командной строки передаются в main() в C и C ++.

argc будет количеством строк, на которые указывает argv.Это (на практике) будет 1 плюс количество аргументов, поскольку практически все реализации будут добавлять имя программы к массиву.

Переменные имеют имя 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:" << std::endl;
    for (int i = 0; i < argc; ++i) {
        std::cout << argv[i] << std::endl;
    }
}

Запуск с ./test a1 b2 c3 приведет к выводу

Have 4 arguments:
./test
a1
b2
c3
50 голосов
/ 11 июня 2010

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

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

for(int i = 0; i < argc; i++)
{
    // argv[i] is the argument at index i
}
17 голосов
/ 20 августа 2015

Предположим, что вы запускаете свою программу таким образом (с использованием синтаксиса 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).
8 голосов
/ 11 июня 2010

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

5 голосов
/ 21 июля 2015

Функция main может иметь два параметра, argc и argv.argc - это целочисленный (int) параметр, и это количество аргументов, переданных программе.

Имя программы всегда является первым аргументом, поэтому в программе будет хотя бы один аргумент, а минимальное значение argc будет одним.Но если программа имеет два аргумента, значение argc будет равно трем.

Параметр argv указывает на строковый массив и называется вектором аргумента .Это одномерный строковый массив аргументов функции.

4 голосов
/ 14 января 2018
int 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.

4 голосов
/ 11 июня 2010

Первый параметр - это количество предоставленных аргументов, а второй параметр - список строк, представляющих эти аргументы.

1 голос
/ 11 июня 2010

Оба из

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

являются юридическими определениями точки входа для программы на C или C ++. Stroustrup: часто задаваемые вопросы по стилю и технике C ++ описывает некоторые варианты, которые возможны или допустимы для вашей основной функции.

...