Аргументы функции main c. Несколько подробностей о функции main. Использование аргументов командной строки
Обратите внимание, в этой версии main() никаких параметров нет. Тем не менее, многие программы нуждаются в некоторых входных данных. Например, предположим, что вы пишете программу под названием Picture, которая принимает изображение в качестве входных данных, а затем делает из этого изображения миниатюру (уменьшенная версия изображения). Как функция Picture узнает, какое изображение нужно принять и обработать? Пользователь должен сообщить программе, какой файл следует открыть. Это можно сделать следующим образом:
// Программа: Picture
#include
Тем не менее, здесь есть потенциальная проблема. Каждый раз, при запуске, программа будет ожидать пользовательский ввод. Это не проблема, если вы вручную запускаете программу из командной строки один раз для одного изображения. Но это уже проблема, если вы хотите работать с большим количеством файлов или чтобы другая программа имела возможность запустить эту программу.
Рассмотрим это детальнее.
Например, вы хотите создать миниатюры для всех файлов-изображений, которые находятся в определённом каталоге. Как это сделать? Вы можете запускать эту программу столько раз, сколько есть изображений в каталоге, введя каждое имя файла вручную. Однако, если есть сотни изображений, такой подход будет, мягко говоря, не очень эффективен! Решением здесь будет написать программу, которая перебирала бы каждое имя файла в каталоге, вызывая каждый раз 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) следующим образом:
int main(int argc, char *argv)
Также вы можете увидеть и такой вариант:
int main(int argc, char** argv)
int main (int argc , char * * argv ) |
Хоть оба эти варианта идентичны по своей сути, но рекомендуется использовать первый, так как он интуитивно понятнее.
argc (англ. «arg ument c ount» = «количество аргументов») — это целочисленный параметр, содержащий количество аргументов, переданных в программу. argc всегда будет как минимум 1, так как первым аргументом всегда является имя самой программы. Каждый аргумент командной строки, который предоставляет пользователь, заставит argc увеличиться на 1.
argv (англ. «arg ument v alues» = «значения аргументов») — это место, где хранятся фактические значения аргументов. Хотя объявление argv выглядит немного пугающе, но это всего лишь массив . Длина этого массива — argc .
Давайте напишем короткую программу MyArguments, которая будет выводить значения всех аргументов командной строки:
// Программа: MyArguments
#include
// Программа: MyArguments #include int main (int argc , char * argv ) // Перебираем каждый аргумент и выводим его порядковый номер и значение for (int count = 0 ; count < argc ; ++ count ) std :: cout << count << " " << argv [ count ] << "\n" ; return 0 ; |
Теперь, при вызове MyArguments с аргументами командной строки SomeContent.txt и 200 , вывод будет следующим:
There are 3 arguments:
0 C:\MyArguments
1 SomeContent.txt
2 200
Параметр 0 — это путь и имя текущей программы. Параметры 1 и 2 здесь являются аргументами командной строки, которые мы передали.
Обработка числовых аргументов
Аргументы командной строки всегда передаются в качестве строк, даже если предоставленное значение является числовым. Чтобы использовать аргумент командной строки в виде числа, вам нужно будет конвертировать его из строки в число. К сожалению, в C++ это делается немного сложнее, чем оно должно быть:
#include
#include #include #include #include int main (int argc , char * argv ) if (argc <= 1 ) // В некоторых операционных системах, argv может быть просто пустой строкой, без имени программы // Обрабатываем случай, когда argv может быть пустым или не пустым if (argv [ 0 ] ) std
::
cout
<<
"Usage: "
<<
argv
[
0
]
<<
" else std
::
cout
<<
"Usage: exit (1 ) ; |
Иногда при запуске программы бывает полезно передать ей какую-либо информацию. Обычно такая информация передается функции main() с помощью аргументов командной строки. Аргумент командной строки - это информация, которая вводится в командной строке операционной системы вслед за именем программы. Например, чтобы запустить компиляцию программы, необходимо в командной строке после подсказки набрать примерно следующее:
Cc имя_программы
имя_программы
представляет собой аргумент командной строки, он указывает имя той программы, которую вы собираетесь компилировать.
Чтобы принять аргументы командной строки, используются два специальных встроенных аргумента: argc и argv . Параметр argc содержит количество аргументов в командной строке и является целым числом, причем он всегда не меньше 1, потому что первым аргументом считается имя программы. А параметр argv является указателем на массив указателей на строки. В этом массиве каждый элемент указывает на какой-либо аргумент командной строки. Все аргументы командной строки являются строковыми, поэтому преобразование каких бы то ни было чисел в нужный двоичный формат должно быть предусмотрено в программе при ее разработке.
Вот простой пример использования аргумента командной строки. На экран выводятся слово Привет и ваше имя, которое надо указать в виде аргумента командной строки.
#include
Если вы назвали эту программу name (имя) и ваше имя Том, то для запуска программы следует в командную строку ввести name Том. В результате выполнения программы на экране появится сообщение Привет, Том.
Во многих средах все аргументы командной строки необходимо отделять друг от друга пробелом или табуляцией. Запятые, точки с запятой и тому подобные символы разделителями не считаются. Например,
Run Spot, run
состоит из трех символьных строк, в то время как
Эрик, Рик, Фред
представляет собой одну символьную строку - запятые, как правило, разделителями не считаются.
Если в строке имеются пробелы, то, чтобы из нее не получилось несколько аргументов, в некоторых средах эту строку можно заключать в двойные кавычки. В результате вся строка будет считаться одним аргументом. Чтобы подробнее узнать, как в вашей операционной системе задаются параметры командной строки, изучите документацию этой системы.
Очень важно правильно объявлять argv . Вот как это делают чаще всего:
Char *argv;
Пустые квадратные скобки указывают на то, что у массива неопределенная длина. Теперь получить доступ к отдельным аргументам можно с помощью индексации массива argv . Например, argv указывает на первую символьную строку, которой всегда является имя программы; argv указывает на первый аргумент и так далее.
Другим небольшим примером использования аргументов командной строки является приведенная далее программа countdown (счет в обратном порядке). Эта программа считает в обратном порядке, начиная с какого-либо значения (указанного в командной строке), и подает звуковой сигнал, когда доходит до 0. Обратите внимание, что первый аргумент, содержащий начальное значение, преобразуется в целое значение с помощью стандартной функции atoi() . Если вторым аргументом командной строки (а если считать аргументом имя программы, то третьим) является строка «display» (вывод на экран), то результат отсчета (в обратном порядке) будет выводиться на экран.
/* Программа счета в обратном порядке. */
#include
Обратите внимание, если аргументы командной строки не будут указаны, то будет выведено сообщение об ошибке. В программах с аргументами командной строки часто делается следующее: в случае, когда пользователь запускает эти программы без ввода нужной информации, выводятся инструкции о том, как правильно указывать аргументы.
Чтобы получить доступ к отдельному символу одного из аргументов командной строки, введите в argv второй индекс. Например, следующая программа посимвольно выводит все аргументы, с которыми ее вызвали:
#include Помните, первый индекс argv обеспечивает доступ к строке, а второй индекс - доступ к ее отдельным символам. Обычно argc и argv используют для того, чтобы передать программе начальные команды, которые понадобятся ей при запуске. Например, аргументы командной строки часто указывают такие данные, как имя файла, параметр или альтернативное поведение. Использование аргументов командной строки придает вашей программе «профессиональный внешний вид» и облегчает ее использование в пакетных файлах. Имена argc и argv являются традиционными, но не обязательными. Эти два параметра в функции main() вы можете назвать как угодно. Кроме того, в некоторых компиляторах для main() могут поддерживаться-дополнительные аргументы, поэтому обязательно изучите документацию к вашему компилятору. Когда для программы не требуются параметры командной строки, то чаще всего явно декларируют функцию main() как не имеющую параметров. В таком случае в списке параметров этой функции используют ключевое слово void . При создании консольного приложения в языке программирования С++, автоматически создается строка очень похожая на эту: Int main(int argc, char* argv) // параметры функции main()
Эта строка — заголовок главной функции main() , в скобочках объявлены параметры argс и argv. Так вот, если программу запускать через командную строку, то существует возможность передать какую-либо информацию этой программе, для этого и существуют параметры argc и argv . Параметр argc имеет тип данных int , и содержит количество параметров, передаваемых в функцию main . Причем argc всегда не меньше 1, даже когда мы не передаем никакой информации, так как первым параметром считается имя функции. Параметр argv это массив указателей на строки. Через командную строку можно передать только данные строкового типа. Указатели и строки — это две большие темы, под которые созданы отдельные разделы. Так вот именно через параметр argv и передается какая-либо информация. Разработаем программу, которую будем запускать через командную строку Windows, и передавать ей некоторую информацию. // argc_argv.cpp: определяет точку входа для консольного приложения.
#include "stdafx.h"
#include // код Code::Blocks // код Dev-C++ // argc_argv.cpp: определяет точку входа для консольного приложения.
#include После того как отладили программу, открываем командную строку Windows и перетаскиваем в окно командной строки экзэшник нашей программы, в командной строке отобразится полный путь к программе(но можно прописать путь к программе в ручную), после этого можно нажимать ENTER
и программа запустится (см. Рисунок 1). Рисунок 1 — Параметры функции main Так как мы просто запустили программу и не передавали ей никаких аргументов, появилось сообщение Not arguments . На рисунке 2 изображён запуск этой же программы через командную строку, но уже с передачей ей аргумента Open . Рисунок 2 — Параметры функции main Аргументом является слово Open , как видно из рисунка, это слово появилось на экране. Передавать можно несколько параметров сразу, отделяя их между собой запятой. Если необходимо передать параметр состоящий из нескольких слов, то их необходимо взять в двойные кавычки, и тогда эти слова будут считаться как один параметр. Например, на рисунке изображен запуск программы, с передачей ей аргумента, состоящего из двух слов — It work . Рисунок 3 — Параметры функции main А если убрать кавычки. То увидим только слово It . Если не планируется передавать какую-либо информацию при запуске программы, то можно удалить аргументы в функции main() , также можно менять имена данных аргументов. Иногда встречается модификации параметров argc и argv , но это все зависит от типа создаваемого приложения или от среды разработки. При автоматизированном создании консольного приложения в языке программирования С++, автоматически создается главная функция очень похожая на эту: int
main(int
argc, char
* argv) Заголовок функции содержит сигнатуру главной функции main()
с аргументами argс
и argv
. При запуске программы через командную строку Windows можно передавать ей некоторую информацию. При этом командная строка будет иметь вид: Аргументы командной строки разделяются одним или несколькими пробелами. Аргумент argv
содержит полное имя приложения: #include
cout << argv << endl; Return
0; Результат выполнения Пример
: вычисление произведения двух целых чисел #include
Int
a = 0, b=0; If
(argc > 1) a = StrToInt(argv); If
(argc > 2) b = StrToInt(argv); cout << a <<«*»
<< b << «= «
<< a*b << endl; Return
0; Запуск программы осуществляется как Результат выполнения Для передачи аргументов командной строки при отладке программы необходимо обратиться к меню Свойства
проекта. При запуске программы в режиме отладки введенные аргументы будут восприниматься программой как аргументы командной строки.
Необязательные и именованные аргументы В версии C# 4.0 внедрено новое средство, повышающее удобство указания аргументов при вызове метода. Это средство называется необязательными аргументами
и
позволяет определить используемое по умолчанию значение для параметра метода. Данное значение будет использоваться по умолчанию в том случае, если для параметра не указан соответствующий аргумент при вызове метода. Следовательно, указывать
аргумент для такого параметра не обязательно. Необязательные аргументы позволяют
упростить вызов методов, где к некоторым параметрам применяются аргументы, выбираемые по умолчанию. Их можно также использовать в качестве "сокращенной"
формы перегрузки методов . Главным стимулом для добавления необязательных
аргументов послужила необходимость в упрощении взаимодействия с объектами СОМ. В нескольких объектных моделях Microsoft (например, Microsoft Office) функциональность предоставляется через объекты СОМ, многие из которых были написаны давно и рассчитаны на использование необязательных параметров. Пример использования необязательных аргументов показан ниже: Using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
// Аргументы b и с указывать при вызове необязательно
static int mySum(int a, int b = 5, int c = 10)
{
return a + b + c;
}
static void Main()
{
int sum1 = mySum(3);
int sum2 = mySum(3,12);
Console.WriteLine("Sum1 = "+sum1);
Console.WriteLine("Sum2 = "+sum2);
Console.ReadLine();
}
}
} Следует иметь в виду, что все необязательные аргументы должны непременно указываться справа от обязательных. Помимо методов, необязательные аргументы можно применять в конструкторах, индексаторах и делегатах. Преимущество необязательных аргументов заключается, в частности, в том, что
они упрощают программирующему обращение со сложными вызовами методов и конструкторов. Ведь нередко в методе приходится задавать больше параметров, чем
обычно требуется. И в подобных случаях некоторые из этих параметров могут быть
сделаны необязательными благодаря аккуратному применению необязательных аргументов. Это означает, что передавать нужно лишь те аргументы, которые важны в
данном конкретном случае, а не все аргументы, которые в противном случае должны быть обязательными. Такой подход позволяет рационализировать метод и упростить
программирующему обращение с ним. Еще одной функциональной возможностью, которая добавилась в C# с выходом версии.NET 4.0, является поддержка так называемых именованных аргументов (named
arguments)
. Как известно, при передаче аргументов методу порядок их следования,
как правило, должен совпадать с тем порядком, в котором параметры определены в самом методе. Иными словами, значение аргумента присваивается параметру по его
позиции в списке аргументов. Данное ограничение призваны преодолеть именованные аргументы. Именованный аргумент позволяет указать имя того параметра, которому
присваивается его значение. И в этом случае порядок следования аргументов уже не имеет никакого значения. Таким образом, именованные аргументы в какой-то степени
похожи на упоминавшиеся ранее инициализаторы объектов, хотя и отличаются от
них своим синтаксисом.
Для указания аргумента по имени служит следующая форма синтаксиса: имя_параметра: значение
Здесь имя_параметра
обозначает имя того параметра, которому передается значение. Разумеется, имя_параметра должно обозначать имя действительного параметра для вызываемого метода.
{…}
Если программу запускать через командную строку, то существует возможность передать какую-либо информацию этой программе. Для этого существуют аргументы командной строки argc
и argv
.
Параметр argc
имеет тип int
, и содержит количество параметров, передаваемых в функцию main
. Причем argc
всегда не меньше 1, даже когда функции main
не передается никакой информации, так как первым параметром считается имя приложения.
Параметр argv
представляет собой массив указателей на строки. Через командную строку можно передать только данные строкового типа.
Диск:\путь\имя.exe аргумент1 аргумент2 …
using namespace
std;
}
В программе используется функция преобразования строки в целое число StrToInt()
отсюда .
using namespace
std;
int
StrToInt(char
*s) {…}
int
main(int
argc, char
* argv) {
}Отладка программы с аргументами командной строки
На вкладке Свойства конфигурации ->Отладка
выбрать Аргументы команды
и задать их значения.Необязательные аргументы
Именованные аргументы