- Аргументы функции main
- Аргументы функции main(): argv и argc
- __argc, __argv, __wargv __argc, __argv, __wargv
- Синтаксис Syntax
- Remarks Remarks
- Сопоставления универсальных текстовых подпрограмм Generic-text routine mappings
- Требования Requirements
- Для чего в main (int argc, char *argv[])
- 3 ответа 3
- Что такое argc, char * argv[]
- Введение
- Вызов без аргументов
- Вызов с аргументами
- В других языках
Аргументы функции main
При автоматизированном создании консольного приложения в языке программирования С++, автоматически создается главная функция очень похожая на эту:
Заголовок функции содержит сигнатуру главной функции main() с аргументами argс и argv .
Если программу запускать через командную строку, то существует возможность передать какую-либо информацию этой программе. Для этого существуют аргументы командной строки argc и argv[] .
Параметр argc имеет тип int , и содержит количество параметров, передаваемых в функцию main . Причем argc всегда не меньше 1, даже когда функции main не передается никакой информации, так как первым параметром считается имя приложения.
Параметр argv[] представляет собой массив указателей на строки. Через командную строку можно передать только данные строкового типа.
При запуске программы через командную строку Windows можно передавать ей некоторую информацию. При этом командная строка будет иметь вид:
Диск:\путь\имя.exe аргумент1 аргумент2 …
Аргументы командной строки разделяются одним или несколькими пробелами.
Аргумент argv[0] содержит полное имя приложения:
Результат выполнения
Пример : вычисление произведения двух целых чисел
В программе используется функция преобразования строки в целое число StrToInt() отсюда.
Запуск программы осуществляется как
Результат выполнения
Отладка программы с аргументами командной строки
Для передачи аргументов командной строки при отладке программы необходимо обратиться к меню Свойства проекта.
На вкладке Свойства конфигурации ->Отладка выбрать Аргументы команды и задать их значения.
При запуске программы в режиме отладки введенные аргументы будут восприниматься программой как аргументы командной строки.
Назад
Аргументы функции main(): argv и argc
Иногда при запуске программы бывает полезно передать ей какую-либо информацию. Обычно такая информация передается функции main() с помощью аргументов командной строки. Аргумент командной строки — это информация, которая вводится в командной строке операционной системы вслед за именем программы. Например, чтобы запустить компиляцию программы, необходимо в командной строке после подсказки набрать примерно следующее:
имя_программы представляет собой аргумент командной строки, он указывает имя той программы, которую вы собираетесь компилировать.
Чтобы принять аргументы командной строки, используются два специальных встроенных аргумента: argc и argv . Параметр argc содержит количество аргументов в командной строке и является целым числом, причем он всегда не меньше 1, потому что первым аргументом считается имя программы. А параметр argv является указателем на массив указателей на строки. В этом массиве каждый элемент указывает на какой-либо аргумент командной строки. Все аргументы командной строки являются строковыми, поэтому преобразование каких бы то ни было чисел в нужный двоичный формат должно быть предусмотрено в программе при ее разработке.
Вот простой пример использования аргумента командной строки. На экран выводятся слово Привет и ваше имя, которое надо указать в виде аргумента командной строки.
Если вы назвали эту программу name (имя) и ваше имя Том, то для запуска программы следует в командную строку ввести name Том . В результате выполнения программы на экране появится сообщение Привет, Том .
Во многих средах все аргументы командной строки необходимо отделять друг от друга пробелом или табуляцией. Запятые, точки с запятой и тому подобные символы разделителями не считаются. Например,
состоит из трех символьных строк, в то время как
представляет собой одну символьную строку — запятые, как правило, разделителями не считаются.
Если в строке имеются пробелы, то, чтобы из нее не получилось несколько аргументов, в некоторых средах эту строку можно заключать в двойные кавычки. В результате вся строка будет считаться одним аргументом. Чтобы подробнее узнать, как в вашей операционной системе задаются параметры командной строки, изучите документацию этой системы.
Очень важно правильно объявлять argv . Вот как это делают чаще всего:
Пустые квадратные скобки указывают на то, что у массива неопределенная длина. Теперь получить доступ к отдельным аргументам можно с помощью индексации массива argv . Например, argv[0] указывает на первую символьную строку, которой всегда является имя программы; argv[1] указывает на первый аргумент и так далее.
Другим небольшим примером использования аргументов командной строки является приведенная далее программа countdown (счет в обратном порядке). Эта программа считает в обратном порядке, начиная с какого-либо значения (указанного в командной строке), и подает звуковой сигнал, когда доходит до 0. Обратите внимание, что первый аргумент, содержащий начальное значение, преобразуется в целое значение с помощью стандартной функции atoi() . Если вторым аргументом командной строки (а если считать аргументом имя программы, то третьим) является строка «display» (вывод на экран), то результат отсчета (в обратном порядке) будет выводиться на экран.
Обратите внимание, если аргументы командной строки не будут указаны, то будет выведено сообщение об ошибке. В программах с аргументами командной строки часто делается следующее: в случае, когда пользователь запускает эти программы без ввода нужной информации, выводятся инструкции о том, как правильно указывать аргументы.
Чтобы получить доступ к отдельному символу одного из аргументов командной строки, введите в argv второй индекс. Например, следующая программа посимвольно выводит все аргументы, с которыми ее вызвали:
Помните, первый индекс argv обеспечивает доступ к строке, а второй индекс — доступ к ее отдельным символам.
Обычно argc и argv используют для того, чтобы передать программе начальные команды, которые понадобятся ей при запуске. Например, аргументы командной строки часто указывают такие данные, как имя файла, параметр или альтернативное поведение. Использование аргументов командной строки придает вашей программе «профессиональный внешний вид» и облегчает ее использование в пакетных файлах.
Имена argc и argv являются традиционными, но не обязательными. Эти два параметра в функции main() вы можете назвать как угодно. Кроме того, в некоторых компиляторах для main() могут поддерживаться-дополнительные аргументы, поэтому обязательно изучите документацию к вашему компилятору.
Когда для программы не требуются параметры командной строки, то чаще всего явно декларируют функцию main() как не имеющую параметров. В таком случае в списке параметров этой функции используют ключевое слово void .
__argc, __argv, __wargv __argc, __argv, __wargv
Глобальная переменная __argc — это счетчик числа аргументов командной строки, переданных программе. The __argc global variable is a count of the number of command-line arguments passed to the program. __argv — указатель на массив одно- или многобайтовых строк, который содержит аргументы программы, а __wargv — указатель на массив строк расширенных символов, который содержит аргументы программы. __argv is a pointer to an array of single-byte-character or multi-byte-character strings that contain the program arguments, and __wargv is a pointer to an array of wide-character strings that contain the program arguments. Эти глобальные переменные обеспечивают аргументы для main или wmain . These global variables provide the arguments to main or wmain .
Синтаксис Syntax
Remarks Remarks
В программе, которая использует функцию main , __argc и __argv инициализируются при запуске программы на основе командной строки, которая используется для запуска программы. In a program that uses the main function, __argc and __argv are initialized at program startup by using the command line that’s used to start the program. Командная строка разбирается на отдельные аргументы, а подстановочные знаки разворачиваются. The command line is parsed into individual arguments, and wildcards are expanded. Число аргументов назначается функции __argc , строки аргументов выделяются в куче, а указатель на массив аргументов назначается __argv . The count of arguments is assigned to __argc and the argument strings are allocated on the heap, and a pointer to the array of arguments is assigned to __argv . В программе, которая скомпилирована для использования расширенных символов и функции wmain , аргументы анализируются и подстановочные знаки разворачиваются как строки расширенных символов, а указатель на массив строк аргументов назначается __wargv . In a program compiled to use wide characters and a wmain function, the arguments are parsed and wildcards are expanded as wide-character strings, and a pointer to the array of argument strings is assigned to __wargv .
Для создания переносимого кода рекомендуется использовать аргументы, переданные в main , чтобы получить аргументы командной строки в программе. For portable code, we recommend you use the arguments passed to main to get the command-line arguments in your program.
Сопоставления универсальных текстовых подпрограмм Generic-text routine mappings
Процедура Tchar.h Tchar.h routine | _UNICODE не определен _UNICODE not defined | _UNICODE определено _UNICODE defined |
---|---|---|
__targv | __argv | __wargv |
Требования Requirements
Глобальная переменная Global variable | Обязательный заголовок Required header |
---|---|
__argc , __argv , __wargv __argc , __argv , __wargv | , (C++) , (C++) |
__argc , __argv и __wargv являются расширениями Майкрософт. __argc , __argv , and __wargv are Microsoft extensions. Сведения о совместимости см. в разделе Совместимость. For compatibility information, see Compatibility.
Для чего в main (int argc, char *argv[])
Недавно начал изучать C++ и не понимаю зачем принимать 2 аргумента? Один — целое число, а второй — массив, ещё и память выделяется как-то странно без new . Откуда приходят эти аргументы и зачем их используют?
3 ответа 3
Это параметры командной строки, которые могут быть переданы Вашему приложению. Первый аргумент передается по той причине, что встроенные массивы в С/С++ не хранят размер и передача размера — один из способов об этом узнать (можно к примеру договориться, что последний элемент будет нулевым, но это накладывает определенные ограничения).
память выделяется как-то странно без new
память выделяется в другом месте, а в функцию приходит только указатель. Как именно она там выделяется — в данный момент Вас тревожить не должно. Главное помнить правило — «кто память выделяет, тот обычно ее и удаляет». В данном случае компилятор вставит весь необходимый код, который выделит память и освободит. Хотя там ещё и система немного может выделить.
Как же приходят аргументы?
К примеру, Вы можете запустить программу так
в этом случае argc будет иметь значение 4. argv[1] будет равно param1. argv[3] будет равно param3. Возникает вопрос, а что в нулевом элементе? а там имя программы в том виде, в котором его предоставляет операционная система. То есть, там может быть как myprog, так и имя с полным путем.
upd: для любителей стандарта — читать пункт 3.6.1. Там в частности сказано, что официально есть два варианта — int main() и int main(int argc, char *argv[]) (хотя последний можно записать как int main(int argc, char **argv) — суть не меняется). Все остальное — на усмотрение компиляторов.
Что такое argc, char * argv[]
Введение
В Си все функции в исполняемом файле вызываются из функции main ().
Функция main () тоже должна быть вызвана. Например, из bash .
Вызов может быть как без аргументов, так и с аргументами.
Начнём с первого варианта
Вызов без аргументов
Если Вы не собираетесь использовать аргументы командной строки, то можно писать int main ()
Что вообще под этим имеется в виду:
Рассмотрим простейшую программу, которую мы написали в файле hello_world.c
#include int main ( int argc, char * argv[])
Предположим, что мы скомпилировали наш hello_world.c в object файл hello_world командой
gcc -o hello_world hello_world.c
И теперь выполняем
Нам совершенно не важно написано
int main ( int argc, char * argv[])
просто int main ()
В какой момент это станет важным?
— В тот момент когда нужно будет вызывать с аргументами
Вызов с аргументами
argc — argument count — это количество аргументов командной строки.
Минимально значение argc это 1. argv[0] это имя программного файла (в нашем случае программный файл это hello_world.c).
Си это очень старый язык, созданный задолго до появления современных графических интерфейсов.
char * — это тип возвращаемого значени
argv[] — argument vector — массив значений этих аргументов
Рассмотрим другую программу, написанную в файле example.c
Она будет ожидать два аргумента типа int .
В коде они будут называться a1 и a2. Обратите внимание на седьмую и восьмую строки.
#include #include int main ( int argc, char * argv[])
Скомпилируйте этот код командой
gcc -o example example.c
Осталось вызвать программу и передать при вызове аргументы прямо в командной строке.
File name = ./example
7 9
Мы вызываем example и прямо в командной строке передаём два аргумента.
Сперва мы убедились что argv[0] это действительно имя файла. Затем увидели переданные аргументы
Теперь, если Вы захотите убрать int argc, char * argv[] из main
Компилятор Вас не поймёт и пожалуется на необъявленные argv
example.c: In function ‘main’: example.c:7:16: error: ‘argv’ undeclared (first use in this function) int a0=atoi(argv[0]); ^
example.c:7:16: note: each undeclared identifier is reported only once for each function it appears in
Если убрать все упоминания о аргументах командной строки из кода и попробовать запустить программу с аргументами — они буду проигнорированы.
#include #include int main ()
gcc -o example example.c
./example 7 9
В других языках
В Python аналогичную функцию выполняет sys.argv
Если остались вопросы — смело задавайте их в Telegram группе — aofeedchat либо воспользуйтесь поиском по сайту
Чтобы следить за выходом новых статей — подписывайтесь на Telegram канал aofeed