Подтвердить что ты не робот

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

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

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

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

int main()

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

4b9b3361

Ответ 1

argv и argc приведены аргументы командной строки для main() в 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

Ответ 2

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

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

for(int i = 0; i < argc; i++)
{
    // argv[i] is the argument at index i
}

Ответ 3

Предположим, что вы запускаете свою программу таким образом (используя синтаксис sh):

myprog arg1 arg2 'arg 3'

Если вы объявили свой основной как int main(int argc, char *argv[]), тогда (в большинстве сред) ваш main() будет вызываться так, как будто:

p = { "myprog", "arg1", "arg2", "arg 3", NULL };
exit(main(4, p));

Однако, если вы объявили свой основной как int main(), он будет называться как-то вроде

exit(main());

и вы не получите переданные аргументы.

Два дополнительных примечания:

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

Ответ 4

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

Ответ 5

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

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

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

Ответ 6

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

Ответ 7

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.

Ответ 8

Оба

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

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