Argc argv c что это
Перейти к содержимому

Argc argv c что это

11.11 – Аргументы командной строки

Как вы узнали из урока «0.4 – Введение в разработку на C++», при компиляции и компоновке программы на выходе получается исполняемый файл. Когда программа запускается, выполнение начинается с функции main() . До этого момента мы объявляли main следующим образом:

Обратите внимание, что эта версия main() не принимает параметров. Однако для работы со многими программами требуются какие-то входные данные. Например, предположим, что вы пишете программу под названием Thumbnail , которая считывает файл изображения, а затем создает миниатюру (уменьшенную версию этого изображения). Как Thumbnail узнает, какое изображение прочитать и обработать? Пользователь должен каким-то образом указать программе, какой файл открыть. Для этого вы можете использовать следующий подход:

Однако при таком подходе есть потенциальная проблема. Каждый раз, когда программа запускается, она будет ждать, пока пользователь введет данные. Это может не быть проблемой, если вы запускаете эту программу один раз вручную из командной строки. Но это проблематично в других случаях, например, когда вы хотите запустить эту программу для многих файлов или запустить ее другой программой.

Давайте рассмотрим эти случаи подробнее.

Рассмотрим случай, когда вы хотите создать миниатюры для всех файлов изображений в заданном каталоге. Как бы вы это сделали? Вы можете запускать эту программу столько раз, сколько изображений в каталоге, печатая имя каждого файла вручную. Однако если бы изображений были сотни, это могло бы занять целый день! Хорошим решением здесь было бы написать программу, которая перебирает имя каждого файла в каталоге, вызывая Thumbnail один раз для каждого файла.

Теперь рассмотрим случай, когда вы запускаете веб-сайт и хотите, чтобы на вашем сайте создавался эскиз каждый раз, когда пользователь загружает изображение на ваш сайт. Эта программа не настроена для приема входных данных из Интернета, так как же человек, загружающий файл, будет вводить имя файла в этом случае? Хорошим решением здесь было бы, чтобы ваш веб-сервер автоматически вызывал Thumbnail после загрузки.

В обоих этих случаях нам нужен способ, чтобы внешняя программа могла передавать имя файла в качестве входных данных для нашей программы Thumbnail при ее запуске, а не заставлять Thumbnail ждать после запуска, пока пользователь введет имя файла.

Аргументы командной строки – это необязательные строковые аргументы, которые операционная система передает программе при ее запуске. Затем программа может использовать их в качестве входных данных (или игнорировать). Подобно параметрам функции, которые позволяют функции предоставлять входные данные для другой функции, аргументы командной строки позволяют людям или программам предоставлять входные данные программе.

Передача аргументов командной строки

Исполняемые программы можно запускать из командной строки, вызывая их по имени. Например, чтобы запустить исполняемый файл " WordCount ", который находится в корневом каталоге диска C: на компьютере с Windows, вы можете ввести:

Чтобы передать аргументы командной строки в WordCount , мы просто перечисляем их после имени исполняемого файла:

Теперь при выполнении WordCount Myfile.txt будет предоставлен в качестве аргумента командной строки. Программа может иметь несколько аргументов командной строки, разделенных пробелами:

Это также работает и в других операционных системах командной строки, таких как Linux (хотя приглашение и структура каталогов, несомненно, будут отличаться).

Если вы запускаете свою программу из среды IDE, в среде IDE должен быть предусмотрен способ ввода аргументов командной строки.

В Microsoft Visual Studio кликните правой кнопкой мыши на своем проекте в обозревателе решений и выберите «Свойства» (Properties). В открывшемся окне разверните дерево «Свойства конфигурации» (Configuration Properties) и выберите «Отладка» (Debugging). На правой панели есть строка с названием «Аргументы команды» (Command Arguments). Вы можете ввести туда аргументы командной строки для тестирования, и они будут автоматически переданы вашей программе при ее запуске.

Задание аргументов командной строки в Microsoft Visual Studio Рисунок 1 – Задание аргументов командной строки в Microsoft Visual Studio

В Code::Blocks выберите «Project» (Проект) → «Set program’s arguments» (Установить аргументы программы).

Задание аргументов командной строки в Code::Blocks Рисунок 2 – Задание аргументов командной строки в Code::Blocks

Использование аргументов командной строки

Теперь, когда вы знаете, как предоставить программе аргументы командной строки, следующим шагом будет доступ к ним из нашей программы на C++. Для этого мы используем другую форму main() . Эта новая форма main() принимает два аргумента (по соглашению названные argc и argv ) следующим образом:

Иногда вы также можете увидеть и такое:

Несмотря на то, что они обрабатываются одинаково, мы предпочитаем первое представление, потому что его интуитивно легче понять.

argc – это целочисленный параметр, содержащий счетчик числа аргументов, переданных программе ( argc = argument count, число аргументов). argc всегда будет не меньше 1 потому, что первым аргументом всегда является имя самой программы. Каждый аргумент командной строки, предоставляемый пользователем, приведет к увеличению argc на 1.

argv – это место, где хранятся фактические значения аргументов ( argv = argument values, значения аргументов, хотя на самом деле расшифровывается как «argument vectors»). Хотя объявление argv выглядит устрашающе, на самом деле argv представляет собой просто массив строк в стиле C. Длина этого массива – argc .

Давайте напишем короткую программу с именем MyArgs для вывода значений всех параметров командной строки:

Теперь, когда мы вызываем эту программу ( MyArgs ) с аргументами командной строки " Myfile.txt " и " 100 ", вывод будет следующим:

Аргумент 0 – это путь и имя текущей запущенной программы. Аргументы 1 и 2 в данном случае – это два параметра командной строки, которые мы передали.

Работа с числовыми аргументами

Аргументы командной строки всегда передаются в виде строк, даже если предоставленное значение является числовым. Чтобы использовать аргумент командной строки в качестве числа, вы должны преобразовать его из строки в число. К сожалению, C++ делает это немного сложнее, чем должно быть.

В C++ это можно сделать следующим образом:

При запуске с вводом " 567 " эта программа печатает:

std::stringstream работает так же, как std::cin . В этом случае мы инициализируем его значением argv[1] , и поэтому можем использовать operator>> для извлечения значения в целочисленную переменную (так же, как и с std::cin ).

Подробнее о std::stringstream мы поговорим в следующей главе.

Операционная система анализирует аргументы командной строки первой

Когда вы вводите что-то в командной строке (или запускаете свою программу из IDE), операционная система должна преобразовать и направить этот запрос соответствующим образом. Это не только включает в себя запуск исполняемого файла, но также включает анализ любых аргументов, чтобы определить, как они должны обрабатываться и передаваться приложению.

Как правило, в операционных системах действуют особые правила обработки специальных символов, таких как двойные кавычки и обратный слеш.

Обычно строки, переданные в двойных кавычках, считаются частью одной строки:

Если вы хотите включить двойную кавычку в состав строки, вам нужно поставить перед двойной кавычкой обратный слеш:

Заключение

Аргументы командной строки предоставляют пользователям и другим программам отличный способ передать входные данные в программу при запуске. Рассмотрите возможность использования любых входных данных, необходимых для работы программы при запуске, в качестве параметров командной строки. Если они не будут переданы через командную строку, вы всегда можете обнаружить это и попросить пользователя ввести данные. Таким образом, ваша программа сможет работать в любом случае.

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

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

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

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

8 ответов

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

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

Переменные называются argc ( количество аргументов ) и argv ( вектор аргументов ) по соглашению, но им может быть присвоен любой действительный идентификатор: int main(int num_args, char** arg_strings) также действителен.

Их также можно полностью опустить, получив int main() , если вы не собираетесь обрабатывать аргументы командной строки.

Попробуйте следующую программу:

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

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

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

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

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

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

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

Следует отметить еще две вещи:

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

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

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

Это объявление используется, когда ваша программа должна принимать аргументы командной строки. При таком запуске:

argc или счетчик аргументов будет установлен на 4 (четыре аргумента), а argv или векторы аргументов будут заполнены строковыми указателями на «myprogram», «arg1», «arg2», и «arg3». Вызов программы ( myprogram ) включен в аргументы!

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

Вы можете добавить еще один параметр:

Параметр envp также содержит переменные среды. Каждая запись имеет следующий формат:

Список переменных среды заканчивается нулем.

ВАЖНО: НЕ используйте значения argv или envp непосредственно в вызовах system() ! Это огромная дыра в безопасности, поскольку злоумышленники могут установить переменные среды в команды командной строки и (потенциально) нанести серьезный ущерб. В общем, просто не используйте system() . Почти всегда есть лучшее решение, реализованное через библиотеки C.

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

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

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

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

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

C++ — Урок 001. Hello World

В этой программе представлено объявление функции main, которая не принимает никаких аргументов. Фигурные скобки отражают группировку в C++ и в данном случае показывают тело функции main. То есть начало функции main — открывающая скобка, и конец функции main — закрывающая скобка. Двойной слэш показывает начало комментария. Комментарии игнорируются компилятором и служат для уточнения информации в коде.

Каждая программа, написанная на C++, имеет в себе функцию main() , с которой начинается запуск программы. Функция main(), как правило, возвращает результат своего выполнения, о чем сигнализирует тип данных int (integer — целочисленный), который написан перед функцией main() . При правильном, успешном завершении функция main() возвращает в качестве результата 0 . Значение результата, отличное от нуля сигнализирует о нештатном завершении программы.

Возвращаемое программой значение по завершению может использоваться в операционной системе для служебных целей.

Типичным примером первой программы на любом языке программирования является вывод текста «Hello, World!»:

Но так ли всё просто в данной программе? В целом, уже одна эта маленькая программа несёт в себе очень большой пласт информации, который необходимо понимать для разработки на C++.

  1. Директива #include
    #include
    сообщает компилятору о том, что необходимо подключить некий заголовочный файл, компоненты которого планируется использовать в файле, где объявлена функция main() . iostream — это стандартная библиотека ввода вывода из STL. То есть здесь уже используется функционал библиотек, хоть и являющихся для языка стандартом. И последний момент — это угловые скобки, в которых находится название библиотеки, которые говорят о том, что это включение внешних файлов в проект, а не тех которые находятся в составе проекта. Те же файлы, которые находятся в составе проекта подключаются обрамляясь в обычные кавычки, например #include «myclass.h». Такое подключение библиотек является стандартом. Например, в Visual Studio при несоблюдении данного стандарта будут выпадать ошибки.
  2. std — это использование пространства имён, в котором находится оператор вывода cout. Пространства имён были введены в C++ для того, чтобы убрать конфликты имён между библиотеками и проектом разработчика, если где-то имеются повторяющиеся наименования функций или классов. В Java для разрешения конфликтов имён используется система пакетов.
  3. cout — это оператор вывода, у которого перегружен оператор << , чтобы не использовать отдельную функцию для вывода текста в консоль.

Это помимо того, что запись функции main может иметь различный вид, хотя стандартом являются две записи:

  1. int main()
  2. int main(int argc, char* argv[])

Можно встретить ещё записи типа void main() и т.д. Но это ошибочные записи, хотя в некоторых компиляторах они будут компилироваться, причём даже без ошибок и предупреждений.

В записи int main(int argc, char* argv[]) передаются аргументы:

  1. argc — указывает количество переданных аргументов. Всегда не меньше 1, поскольку всегда передаётся имя программы
  2. argv[] — массив указателей на аргументы, которые передаются в качестве строковых переменных.

Если argc больше 1, значит при запуске программы были переданы дополнительные аргументы.

Проверка может выглядеть следующим образом:

В целом, есть большое количество моментов, которые необходимо понимать в C++ даже для небольшой программы, но от этого только интереснее 😉

Добавить комментарий

Ваш адрес email не будет опубликован.