Урок №110. Аргументы командной строки

  Юрий  | 

  Обновл. 9 Июн 2019  | 

 19874

 ǀ   4 

В этом уроке мы рассмотрим, что такое аргументы командной строки и как они используются.

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

Из урока №3 мы уже знаем, что при компиляции и линкинге, компилятор создаёт исполняемый файл. Когда программа запускается, выполнение начинается из первой строки функции main(). До этого урока мы объявляли main() следующим образом:

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

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

Рассмотрим это детальнее.

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

Теперь рассмотрим случай, когда у вас есть веб-сайт, и вы хотите, чтобы он создавал миниатюру каждый раз, когда пользователь загружает изображение на сайт. Эта программа не может принимать входные данные из Интернета и следует логический вопрос: «Как тогда вводить имя файла?». Выход есть: вызов веб-сервером функции Picture автоматически каждый раз после загрузки файла.

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

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

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


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

C:\>MyProgram

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

C:\>MyProgram SomeContent.txt

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

C:\>MyProgram SomeContent.txt SomeOtherContent.txt

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

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

Для пользователей Visual Studio: Щёлкните правой кнопкой мыши на нужный проект в Обозревателе Решений, а затем выберите «Свойства»:

Затем «Свойства конфигурации > Отладка». На правой панели будет строка «Аргументы команды». Вы сможете здесь ввести аргументы командной строки, и они будут автоматически переданы вашей программе при её запуске:

Пользователям Code::Blocks нужно выбрать «Project > Set program`s arguments»:

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

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

Также вы можете увидеть и такой вариант:

Хоть оба эти варианта идентичны по своей сути, но рекомендуется использовать первый, так как он интуитивно понятнее.

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

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

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

Теперь, при вызове MyArguments с аргументами командной строки SomeContent.txt и 200, вывод будет следующим:

There are 3 arguments:
0 C:\MyArguments
1 SomeContent.txt
2 200

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

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


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

Если мы запустим эту программу с аргументом командной строки 843, то результатом будет:

Got integer: 843

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

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

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

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

Операционные системы имеют специальные правила обработки спец. символов (двойные кавычки, бэкслешы и т.д.).

Например:

MyArguments Hello world!

Результат:

There are 3 arguments:
0 C:\MyArguments
1 Hello
2 world!

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

MyArguments "Hello world!"

Результат:

There are 2 arguments:
0 C:\MyArguments
1 Hello world!

Для того, чтобы вывести каждое слово отдельно на строке, используйте бэкслешы:

MyArguments \"Hello world!\"

Результат:

There are 3 arguments:
0 C:\MyArguments
1 "Hello
2 world!"

Заключение


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

Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (78 оценок, среднее: 4,73 из 5)
Загрузка...

Комментариев: 4

  1. Аватар TurboOSMaker:

    У меня возникла такая проблема: вы привели примеры добавления аргументов для Visual Studio и Code::Blocks. А что делать пользователям Dev-C++?

  2. Аватар Ксения:

    Добрый день!
    Не понятно, что именно происходит при обработке ситуации, когда argv[0] является просто пустой строкой. <program name>, <number> — они как-то инициализируются? Что именно выведет программа в случае не пустой и пустой строки?

    1. Аватар Александр:

      первым аргументом ВСЕГДА идет исполняемый файл программы. Поэтому такого просто не может произойти

  3. Аватар Elena:

    спасибо за отличное объяснение, понятное даже новичку. помогло разобраться с 1м домашним заданием в институте. Только вот запустить из командной строки пока не получается никак..

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

Ваш E-mail не будет опубликован. Обязательные поля помечены *

telegram канал
НОВОСТИ RAVESLI