передача аргументов командной строки при запуске консольного приложения
main аргументы функции и командной строки
main Сигнатура функции
main Функция не имеет объявления, так как она встроена в язык. Если это так, синтаксис объявления для main будет выглядеть следующим образом:
Стандартные аргументы командной строки
Аргументы для main обеспечения удобного анализа аргументов в командной строке. Типы для параметров argc и argv определяются языком. Имена argc и argv являются традиционными, но их можно называть по своему усмотрению.
Используются следующие определения аргументов.
Сведения о подавлении обработки в командной строке см. в разделе Настройка обработки командной строки C++.
Расширения, относящиеся к Microsoft
В следующих разделах описывается поведение, характерное для Майкрософт.
wmain Функция и _tmain макрос
Возврат void из main
Как расширение Майкрософт, main wmain функции и могут быть объявлены как возвращаемые void (без возвращаемого значения). Это расширение также доступно в некоторых других компиляторах, но его использование не рекомендуется. Он доступен для симметрии, если main не возвращает значение.
envp Аргумент командной строки
main wmain Сигнатуры или позволяют дополнительному расширению для доступа к переменным среды, относящимся к Microsoft. это расширение также распространено в других компиляторах для Windows и UNIX систем. Имя envp является традиционным, но вы можете присвоить параметру среды любое имя. Ниже приведены эффективные объявления для списков аргументов, включающих параметр среды:
Примеры аргументов для main
В следующем примере показано, как использовать argc аргументы, argv и envp в следующих main случаях:
Анализ аргументов командной строки C++
Правила синтаксического анализа командной строки, используемые кодом Microsoft C/C++, специфичны для Microsoft. Код запуска среды выполнения использует эти правила при интерпретации аргументов, заданных в командной строке операционной системы:
Аргументы разделяются пробелами (пробел или табуляция).
Строка, заключенная в двойные кавычки, интерпретируется как один аргумент, который может содержать пробелы в char актерс. Строку в кавычках можно встроить в аргумент. Курсор ( ^ ) не распознается как escape- char актер или разделитель. Внутри заключенной в кавычки строки пара двойных кавычек интерпретируется как одна экранированная двойная кавычка. Если командная строка заканчивается до тех пор, пока не будет найдена закрывающая двойная кавычка, то все char прочитанные актерс будут выводиться в качестве последнего аргумента.
Символ двойной кавычки после обратной косой черты ( \» ) интерпретируется как литеральный символ двойной кавычки ( « ).
Символы обратной косой черты считаются литералами, если сразу за ними не стоит двойная кавычка.
Если двойная кавычка стоит после четного числа символов обратной косой черты, в массив argv помещается по одному символу обратной косой черты ( \ ) для каждой пары символов обратной косой черты ( \\ ), а сама двойная кавычка ( « ) интерпретируется как разделитель строк.
Пример синтаксического анализа аргументов командной строки
В следующем примере программы показана передача аргументов командной строки:
Результаты синтаксического анализа командных строк
В следующей таблице показаны примеры входных данных и ожидаемые выходные данные, иллюстрирующие применение правил из приведенного выше списка.
Входные данные командной строки | argv[1] | argv[2] | argv3-5 |
---|---|---|---|
«abc» d e | abc | d | e |
a\\b d»e f»g h | a\\b | de fg | h |
a\\\»b c d | a\»b | c | d |
a\\\\»b c» d e | a\\b c | d | e |
a»b»» c d | ab» c d |
Развертывание подстановочных знаков
Кроме того, компилятор Майкрософт позволяет использовать подстановочный знак char актерс, вопросительный знак ( ? ) и звездочку ( * ), чтобы указать аргументы filename и Path в командной строке.
Аргументы командной строки обрабатываются внутренней подпрограммой в коде запуска среды выполнения, который по умолчанию не расширяет подстановочные знаки в отдельные строки в argv массиве строк. Можно включить расширение подстановочных знаков, включив setargv.obj файл ( wsetargv.obj файл для wmain ) в /link параметрах компилятора или в LINK командной строке.
Дополнительные сведения о параметрах компоновщика для запуска среды выполнения см. в статье Параметры ссылок.
Настройка обработки командной строки C++
Программа может вызывать семейство подпрограмм spawn или exec в библиотеке среды выполнения C. В этом случае не следует подавлять подпрограмму обработки среды, так как она используется для передачи данных о среде из родительского процесса в дочерний.
Урок №110. Аргументы командной строки
Обновл. 13 Сен 2021 |
На этом уроке мы рассмотрим, что такое аргументы командной строки в языке C++ и то, как они используются.
Аргументы командной строки
Из урока №3 мы уже знаем, что при компиляции и линкинге, компилятор создает исполняемый файл. Когда программа запускается, выполнение начинается с первой строки функции main(). До этого урока мы объявляли main() следующим образом:
Обратите внимание, в этой версии функции main() никаких параметров нет. Тем не менее, многие программы нуждаются в некоторых входных данных. Например, предположим, что вы пишете программу под названием Picture, которая принимает изображение в качестве входных данных, а затем делает из этого изображения миниатюру (уменьшенная версия изображения). Как функция picture() узнает, какое изображение нужно принять и обработать? Пользователь должен сообщить программе, какой файл следует открыть. Это можно сделать следующим образом:
Тем не менее, здесь есть потенциальная проблема. Каждый раз при запуске программа будет ожидать пользовательский ввод. Это не проблема, если вы вручную запускаете программу из командной строки один раз для одного изображения. Но это уже проблема, если вы хотите работать с большим количеством файлов или чтобы другая программа имела возможность запустить эту программу.
Рассмотрим это детально. Например, вы хотите создать миниатюры для всех файлов-изображений, которые находятся в определенном каталоге. Как это сделать? Вы можете запускать эту программу столько раз, сколько есть изображений в каталоге, введя каждое имя файла вручную. Однако, если есть сотни изображений, такой подход будет, мягко говоря, не очень эффективным! Решением здесь будет написать программу, которая перебирала бы каждое имя файла в каталоге, вызывая каждый раз функцию picture() для каждого файла.
Теперь рассмотрим случай, когда у вас есть веб-сайт, и вы хотите, чтобы он создавал миниатюру каждый раз, когда пользователь загружает изображение на сайт. Эта программа не может принимать входные данные из Интернета и следует логический вопрос: «Как тогда вводить имя файла?». Выходом является вызов веб-сервером функции picture() автоматически каждый раз после загрузки файла.
В обоих случаях нам нужно, чтобы внешняя программа передавала имя файла в качестве входных данных в нашу программу при её запуске, вместо того, чтобы функция picture() сама дожидалась, пока пользователь вручную введет имя файла.
Аргументы командной строки — это необязательные строковые аргументы, передаваемые операционной системой в программу при её запуске. Программа может их использовать в качестве входных данных, либо игнорировать. Подобно тому, как параметры одной функции предоставляют данные для параметров другой функции, так и аргументы командной строки предоставляют возможность людям или программам предоставлять входные данные для программы.
Передача аргументов командной строки
C:\>MyProgram SomeContent.txt SomeOtherContent.txt
Это также работает и с Linux (хотя структура каталогов будет отличаться от структуры каталогов в Windows).
Если вы запускаете свою программу из среды IDE, то ваша IDE должна предоставить способ ввода аргументов командной строки.
Для пользователей Visual Studio: Щелкните правой кнопкой мыши по нужному проекту в меню «Обозреватель решений» > «Свойства» :
Пользователям Code::Blocks: Выберите «Project» > «Set program`s arguments. » :
Использование аргументов командной строки
Теперь, когда вы знаете, как передавать аргументы командной строки в программу, следующим шагом будет доступ к ним из программы. Для этого используется уже другая форма функции main(), которая принимает два аргумента ( argc и argv ) следующим образом:
11.11 – Аргументы командной строки
Необходимость аргументов командной строки
Однако при таком подходе есть потенциальная проблема. Каждый раз, когда программа запускается, она будет ждать, пока пользователь введет данные. Это может не быть проблемой, если вы запускаете эту программу один раз вручную из командной строки. Но это проблематично в других случаях, например, когда вы хотите запустить эту программу для многих файлов или запустить ее другой программой.
Давайте рассмотрим эти случаи подробнее.
Рассмотрим случай, когда вы хотите создать миниатюры для всех файлов изображений в заданном каталоге. Как бы вы это сделали? Вы можете запускать эту программу столько раз, сколько изображений в каталоге, печатая имя каждого файла вручную. Однако если бы изображений были сотни, это могло бы занять целый день! Хорошим решением здесь было бы написать программу, которая перебирает имя каждого файла в каталоге, вызывая Thumbnail один раз для каждого файла.
Теперь рассмотрим случай, когда вы запускаете веб-сайт и хотите, чтобы на вашем сайте создавался эскиз каждый раз, когда пользователь загружает изображение на ваш сайт. Эта программа не настроена для приема входных данных из Интернета, так как же человек, загружающий файл, будет вводить имя файла в этом случае? Хорошим решением здесь было бы, чтобы ваш веб-сервер автоматически вызывал Thumbnail после загрузки.
В обоих этих случаях нам нужен способ, чтобы внешняя программа могла передавать имя файла в качестве входных данных для нашей программы Thumbnail при ее запуске, а не заставлять Thumbnail ждать после запуска, пока пользователь введет имя файла.
Аргументы командной строки – это необязательные строковые аргументы, которые операционная система передает программе при ее запуске. Затем программа может использовать их в качестве входных данных (или игнорировать). Подобно параметрам функции, которые позволяют функции предоставлять входные данные для другой функции, аргументы командной строки позволяют людям или программам предоставлять входные данные программе.
Передача аргументов командной строки
Исполняемые программы можно запускать из командной строки, вызывая их по имени. Например, чтобы запустить исполняемый файл » WordCount «, который находится в корневом каталоге диска C: на компьютере с Windows, вы можете ввести:
Теперь при выполнении WordCount Myfile.txt будет предоставлен в качестве аргумента командной строки. Программа может иметь несколько аргументов командной строки, разделенных пробелами:
Это также работает и в других операционных системах командной строки, таких как Linux (хотя приглашение и структура каталогов, несомненно, будут отличаться).
Если вы запускаете свою программу из среды IDE, в среде IDE должен быть предусмотрен способ ввода аргументов командной строки.
В Microsoft Visual Studio кликните правой кнопкой мыши на своем проекте в обозревателе решений и выберите «Свойства» (Properties). В открывшемся окне разверните дерево «Свойства конфигурации» (Configuration Properties) и выберите «Отладка» (Debugging). На правой панели есть строка с названием «Аргументы команды» (Command Arguments). Вы можете ввести туда аргументы командной строки для тестирования, и они будут автоматически переданы вашей программе при ее запуске.
Рисунок 1 – Задание аргументов командной строки в Microsoft Visual Studio
В Code::Blocks выберите «Project» (Проект) → «Set program’s arguments» (Установить аргументы программы).
Рисунок 2 – Задание аргументов командной строки в Code::Blocks
Использование аргументов командной строки
Иногда вы также можете увидеть и такое:
Несмотря на то, что они обрабатываются одинаково, мы предпочитаем первое представление, потому что его интуитивно легче понять.
argc – это целочисленный параметр, содержащий счетчик числа аргументов, переданных программе ( argc = argument count, число аргументов). argc всегда будет не меньше 1 потому, что первым аргументом всегда является имя самой программы. Каждый аргумент командной строки, предоставляемый пользователем, приведет к увеличению argc на 1.
Давайте напишем короткую программу с именем MyArgs для вывода значений всех параметров командной строки:
Теперь, когда мы вызываем эту программу ( MyArgs ) с аргументами командной строки » Myfile.txt » и » 100 «, вывод будет следующим:
Аргумент 0 – это путь и имя текущей запущенной программы. Аргументы 1 и 2 в данном случае – это два параметра командной строки, которые мы передали.
Работа с числовыми аргументами
Аргументы командной строки всегда передаются в виде строк, даже если предоставленное значение является числовым. Чтобы использовать аргумент командной строки в качестве числа, вы должны преобразовать его из строки в число. К сожалению, C++ делает это немного сложнее, чем должно быть.
В C++ это можно сделать следующим образом:
При запуске с вводом » 567 » эта программа печатает:
Подробнее о std::stringstream мы поговорим в следующей главе.
Операционная система анализирует аргументы командной строки первой
Когда вы вводите что-то в командной строке (или запускаете свою программу из IDE), операционная система должна преобразовать и направить этот запрос соответствующим образом. Это не только включает в себя запуск исполняемого файла, но также включает анализ любых аргументов, чтобы определить, как они должны обрабатываться и передаваться приложению.
Как правило, в операционных системах действуют особые правила обработки специальных символов, таких как двойные кавычки и обратный слеш.
Обычно строки, переданные в двойных кавычках, считаются частью одной строки:
Если вы хотите включить двойную кавычку в состав строки, вам нужно поставить перед двойной кавычкой обратный слеш:
Заключение
Аргументы командной строки предоставляют пользователям и другим программам отличный способ передать входные данные в программу при запуске. Рассмотрите возможность использования любых входных данных, необходимых для работы программы при запуске, в качестве параметров командной строки. Если они не будут переданы через командную строку, вы всегда можете обнаружить это и попросить пользователя ввести данные. Таким образом, ваша программа сможет работать в любом случае.
Как задать аргументы командной строки в Visual Studio
Время чтения: 4 минуты
Иногда нужно, чтобы программа выполняла разные действия в зависимости от заданных параметров при запуске. Для этого используется механизм аргументов командной строки. Чтобы задать аргументы достаточно написать их в консоли после имени запускаемой программы. Однако при работе в интегрированной среде разработки Visual Studio вы не запускаете программу через консоль самостоятельно, так как этим занимается сама студия. К сожалению, далеко не очевидно, каким образом задавать аргументы командной строки в Visual Studio. Конечно, можно просто открыть консоль, перейти в папку с проектом и запустить приложение прямо оттуда, передав нужные аргументы, однако есть способ сделать это прямо в среде разработки. Так давайте разберёмся ним и научимся передавать аргументы прямо из студии, не запуская консоль и не ища расположение запускаемого проекта.
Шаг первый. Создаём новый С++ проект
Если вы не знаете, как создать новый проект, прочитайте нашу статью об этом: Как создать C/C++ проект в Visual Studio.
Студия создаст проект и открое редактор кода, в котором будет примерно следующее:
Шаг второй. Пишем код для отображения переданных аргументов
Напишем простую программу, которая будет выводить все аргументы командной строки кроме имени запускаемого файла или выводить сообщение «no arguments», если аргументы не будут переданы. Для проверки количества аргументов проверим значение argc. Если оно равно 1, то аргументы помимо имени исполняемого файла не переднаны и необходимо вывести сообщение об этом. в противном же случае пройдёмся по всем аргументам, начиная со второго (с первого, если считать от нуля) и выведим содержимое каждого из них:
Запустим приложение и убедимся, что ни одного аргумента помимо имени программы передано не было:
Шаг третий. Задание аргументов командной строки
Чтобы передать аргументы командной строки в Visual Studio нужно:
Напишем там какие-нибудь аргументы для проверки и ещё раз запустим приложение
Программа вывела все аргументы, которые только что были переданы. А значит мы научились задавать параметры командной строки прямо в Visual Studio.
Программист, сооснователь programforyou.ru, в постоянном поиске новых задач и алгоритмов
Языки программирования: Python, C, C++, Pascal, C#, Javascript
Выпускник МГУ им. М.В. Ломоносова
Programforyou — это сообщество, в котором Вы можете подтянуть свои знания по программированию, узнать, как эффективно решать те или иные задачи, а также воспользоваться нашими онлайн сервисами.
Аргументы функции main
При автоматизированном создании консольного приложения в языке программирования С++, автоматически создается главная функция очень похожая на эту:
При запуске программы через командную строку Windows можно передавать ей некоторую информацию. При этом командная строка будет иметь вид:
Диск:\путь\имя.exe аргумент1 аргумент2 …
Аргументы командной строки разделяются одним или несколькими пробелами.
Аргумент argv[0] содержит полное имя приложения:
Результат выполнения
Пример : вычисление произведения двух целых чисел
В программе используется функция преобразования строки в целое число StrToInt() отсюда.
Запуск программы осуществляется как
Результат выполнения
Отладка программы с аргументами командной строки
При запуске программы в режиме отладки введенные аргументы будут восприниматься программой как аргументы командной строки.
Назад