Что такое argc, char * argv[]

ДОСТУП К ПЕРЕМЕННЫМ СРЕДЫ ОПЕРАЦИОННОЙ СИСТЕМЫ

Как вы знаете, большинство операционных систем позволяют вам определять переменные среды, к которым ваши программы могут обращаться для определения разных параметров, таких как командный путь. Например, если вы используете среду MS-DOS, вы устанавливаете или выводите переменные среды с помощью команды SET. В зависимости от типа вашего компилятора вы можете обращаться к переменным среды из вашей программы, используя третий параметрmain -с именемenv. -Подобно параметруargv,параметрenv -представляет собой указатель на массив указателей на символьные строки. Также, подобноargv, -C++ завершает этот массив символом NULL. Если ваш компилятор поддерживает параметрenv, -вы можете изменить заголовок функцииmain, —как показано ниже:

Следующая программа SHOWENV.CPP выполняет цикл по элементам массиваenv длявывода переменных среды программы:

Как видите, программа просто выполняет цикл по элементам массиваenv, —пока не встретит указатель NULL, который указывает последнюю запись массива. Если вы откомпилируете и запустите эту программу, она выведет ваши переменные среды, как показано ниже:

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

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

#include <iostream>
#include <string>
#include <sstream> // для std::stringstream
#include <cstdlib> // для exit()

int main(int argc, char *argv[])
{
if (argc <= 1)
{
// В некоторых операционных системах argv может быть просто пустой строкой, без имени программы

// Обрабатываем случай, когда argv может быть пустым или не пустым
if (argv)
std::cout << «Usage: » << argv << » <number>» << ‘\n’;
else
std::cout << «Usage: <program name> <number>» << ‘\n’;

exit(1);
}

std::stringstream convert(argv); // создаем переменную stringstream с именем convert, инициализируя её значением argv

int myint;
if (!(convert >> myint)) // выполняем конвертацию
myint = 0; // если конвертация терпит неудачу, то присваиваем myint значение по умолчанию

std::cout << «Got integer: » << myint << ‘\n’;

return 0;
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

#include <iostream>
#include <string>
#include <sstream> // для std::stringstream
#include <cstdlib> // для exit()

intmain(intargc,char*argv)

{

if(argc<=1)

{

// В некоторых операционных системах argv может быть просто пустой строкой, без имени программы

// Обрабатываем случай, когда argv может быть пустым или не пустым

if(argv)

std::cout<<«Usage: «<<argv<<» <number>»<<‘\n’;

else

std::cout<<«Usage: <program name> <number>»<<‘\n’;

exit(1);

}

std::stringstream convert(argv1);// создаем переменную stringstream с именем convert, инициализируя её значением argv

intmyint;

if(!(convert>>myint))// выполняем конвертацию

myint=;// если конвертация терпит неудачу, то присваиваем myint значение по умолчанию

std::cout<<«Got integer: «<<myint<<‘\n’;

return;

}

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

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

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

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

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

Например:

Результат:

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

Результат:

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

Результат:

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

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

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

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

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

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

Для пользователей Visual Studio: Щелкните правой кнопкой мыши по нужному проекту в меню :

Затем выберите . На правой панели будет строка . Вы сможете здесь ввести аргументы командной строки, и они будут автоматически переданы вашей программе при её запуске:

Пользователям Code::Blocks: Выберите :

ДОСТУП К argv И argc

Если вы запускаете программу из системной подсказки, командная строка, которую вы вводите, становится вашей командной строкой:

В данном случае командная строка указывает команду (COPY) и два аргумента (имя файлов SOURCE. DOC и TARGET. DOC). Чтобы разрешить вашей программе доступ к командной строке, C++ передает два параметра в функцию main:

Первый параметр argc содержит количество элементов в массиве argv.Например, в случае предыдущей команды COPY параметр argc должен содержать значение 3 (он включает имя команды и два аргумента). Следующая программа SHOWARGC.CPP использует параметр argc для вывода количества аргументов командной строки:

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

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

Рис. 36. Массив argv указывает аргументы командной строки.

Второй параметр функции main с именем argv представляет собой массив указателей на символьные строки, которые содержат индивидуальные части командной строки. Например, рис. 36 иллюстрирует, как элементы массива argv могли бы указывать записи командной строки.

Следующая программа SHOWARGV.CPP использует оператор for для вывода элементов массива argv (командная строка программы). Программа запускается с первого элемента массива (имя программы) и затем выводит каждый элемент, пока значение переменной цикла не станет больше, чем argc:

Откомпилируйте и запустите эту программу, используя командную строку, подобную следующей:

ДОСТУП К —argv -И —argc

Если вы запускаете программу из системной подсказки, командная строка, которую вы вводите, становится вашей командной строкой:

В данном случае командная строка указывает команду (COPY) и два аргумента (имя файлов SOURCE. DOC и TARGET. DOC). Чтобы разрешить вашей программе доступ к командной строке, C++ передает два параметра в функциюmain:

Первый параметр argc содержит количество элементов в массивеargv. -Например, в случае предыдущей команды COPY параметрargc -должен содержать значение 3 (он включает имя команды и два аргумента). Следующая программа SHOWARGC.CPP использует параметрargc -для вывода количества аргументов командной строки:

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

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

Рис. 36. Массивargv -указывает аргументы командной строки.

Второй параметр функцииmain с -именемargv -представляет собой массив указателей на символьные строки, которые содержат индивидуальные части командной строки. Например, рис. 36 иллюстрирует, как элементы массива —argv -могли бы указывать записи командной строки.

Следующая программа SHOWARGV.CPP использует операторfor -для вывода элементов массиваargv -(командная строка программы). Программа запускается с первого элемента массива (имя программы) и затем выводит каждый элемент, пока значение переменной цикла не станет больше, чемargc:

Откомпилируйте и запустите эту программу, используя командную строку, подобную следующей:

ТРАКТОВКА —argv -КАК УКАЗАТЕЛЯ

Как
вы уже знаете, C++ позволяет вам обращаться к элементам массивов, используя указатели. Следующая программа ARGVPTR.CPP трактует
argv -как указатель на указатель символьной строки (другими словами, указатель на указатель), чтобы вывести содержимое командной строки:

Выберите время, чтобы проанализировать объявление параметраargvв main:

Первая звездочка в объявлении сообщает компилятору C++, чтоargv -представляет собой указатель. Вторая звездочка сообщает компилятору, чтоargv —представляет собой указатель на указатель — в данном случае указатель на указатель типаchar. -Представьтеargv -как массив указателей. Каждый элемент массива в данном случае указывает на массив типаchar.

Необходимость аргументов командной строки

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

Обратите внимание, что эта версия не принимает параметров. Однако для работы со многими программами требуются какие-то входные данные

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ИСПОЛЬЗОВАНИЕ АРГУМЕНТОВ КОМАНДНОЙ СТРОКИ

Следующая программа FILESHOW.CPP использует аргументы командной строки для вывода содержимого указанного пользователем файла на экран. Например, чтобы использовать программу FILESHOW для вывода содержимого файла AUTOEXEC.BAT из корневого каталога, ваша командная строка становится следующей:

Следующие операторы реализуют программу FILESHOW.CPP. Эта программа начинается с проверки параметраargc, -чтобы убедиться, что пользователь указал файл в командной строке. Если пользователь включает имя файла параметрargc -будет содержать значение 2. Далее программа открывает и выводит содержимое файла, используя методы, которые вы изучали в уроке 34. Как видите, если программа не может открыть указанный файл, она выводит сообщение об ошибке и завершается:

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

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

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

Теперь при выполнении 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

envp -Command-Line-Argument «>envp аргумента командной строки

Сигнатуры или позволяют дополнительному расширению для доступа к переменным среды, относящимся к Microsoft. это расширение также распространено в других компиляторах для Windows и UNIX систем. Имя является традиционным, но вы можете присвоить параметру среды любое имя. Ниже приведены эффективные объявления для списков аргументов, включающих параметр среды:

Необязательный параметр представляет собой массив строк, представляющих переменные, заданные в среде пользователя. Этот массив завершается записью NULL. Он может быть объявлен как массив указателей на ( ) или как указатель на указатели на ( ). Если программа использует вместо , используйте тип данных вместо .

Блок среды, переданный в и , является замороженной копией текущей среды. Если впоследствии среда будет изменена путем вызова или , то текущая среда (как возвращаемая переменной или, а также переменная или) изменится , но блок, на который указывает, не изменится. Дополнительные сведения о подавлении обработки среды см. в разделе . Аргумент совместим с стандартом C89, но не с стандартами C++.

Main «>примеры аргументов

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

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

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

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

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

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

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

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

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

Например:

печатает:

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

печатает:

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

печатает:

ТРАКТОВКА argv КАК УКАЗАТЕЛЯ

Как вы уже знаете, C++ позволяет вам обращаться к элементам массивов, используя указатели. Следующая программа ARGVPTR.CPP трактует argvкак указатель на указатель символьной строки (другими словами, указатель на указатель), чтобы вывести содержимое командной строки:

Выберите время, чтобы проанализировать объявление параметра argvв main:

Первая звездочка в объявлении сообщает компилятору C++, что argvпредставляет собой указатель. Вторая звездочка сообщает компилятору, что argv представляет собой указатель на указатель — в данном случае указатель на указатель типа char. Представьте argv как массив указателей. Каждый элемент массива в данном случае указывает на массив типа char.

ДОСТУП К ПЕРЕМЕННЫМ СРЕДЫ ОПЕРАЦИОННОЙ СИСТЕМЫ

Как вы знаете, большинство операционных систем позволяют вам определять переменные среды, к которым ваши программы могут обращаться для определения разных параметров, таких как командный путь. Например, если вы используете среду MS-DOS, вы устанавливаете или выводите переменные среды с помощью команды SET. В зависимости от типа вашего компилятора вы можете обращаться к переменным среды из вашей программы, используя третий параметр main с именем env.Подобно параметру argv, параметр env представляет собой указатель на массив указателей на символьные строки. Также, подобно argv, C++ завершает этот массив символом NULL. Если ваш компилятор поддерживает параметр env, вы можете изменить заголовок функции main,как показано ниже:

Следующая программа SHOWENV.CPP выполняет цикл по элементам массива env для вывода переменных среды программы:

Как видите, программа просто выполняет цикл по элементам массива env,пока не встретит указатель NULL, который указывает последнюю запись массива. Если вы откомпилируете и запустите эту программу, она выведет ваши переменные среды, как показано ниже:

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

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

int main(int argc, char *argv[])

1 intmain(intargc,char*argv)

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

int main(int argc, char** argv)

1 intmain(intargc,char**argv)

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

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

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

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

// Программа MyArguments
#include <iostream>

int main(int argc, char *argv[])
{
std::cout << «There are » << argc << » arguments:\n»;

// Перебираем каждый аргумент и выводим его порядковый номер и значение
for (int count=0; count < argc; ++count)
std::cout << count << » » << argv << ‘\n’;

return 0;
}

1
2
3
4
5
6
7
8
9
10
11
12
13

// Программа MyArguments
#include <iostream>

intmain(intargc,char*argv)

{

std::cout<<«There are «<<argc<<» arguments:\n»;

// Перебираем каждый аргумент и выводим его порядковый номер и значение

for(intcount=;count<argc;++count)

std::cout<<count<<» «<<argvcount<<‘\n’;

return;

}

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

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

ИСПОЛЬЗОВАНИЕ АРГУМЕНТОВ КОМАНДНОЙ СТРОКИ

Следующая программа FILESHOW.CPP использует аргументы командной строки для вывода содержимого указанного пользователем файла на экран. Например, чтобы использовать программу FILESHOW для вывода содержимого файла AUTOEXEC.BAT из корневого каталога, ваша командная строка становится следующей:

Следующие операторы реализуют программу FILESHOW.CPP. Эта программа начинается с проверки параметра argc, чтобы убедиться, что пользователь указал файл в командной строке. Если пользователь включает имя файла параметр argc будет содержать значение 2. Далее программа открывает и выводит содержимое файла, используя методы, которые вы изучали в уроке 34. Как видите, если программа не может открыть указанный файл, она выводит сообщение об ошибке и завершается:

5 ответов

Лучший ответ

Либо передайте их как параметры, либо сохраните в глобальных переменных. Пока вы не вернетесь из main и не попытаетесь обработать их в обработчике или деструкторе объекта в глобальной области видимости, они все еще существуют, и к ним можно будет получить доступ из любой области.

Например:

Альтернативно:

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

4

Adam Rosenfield
12 Окт 2012 в 15:55

Linux предоставляет и .

Mike
27 Сен 2018 в 20:58

Посмотрите » «семейство функций и библиотек. Они предлагают структурированный способ определения аргументов, ожидаемых вашей программой, и могут затем легко их проанализировать для вас. Также может помочь с созданием документации / справочных ответов.

Это старая библиотека в мире UNIX, и на C # тоже есть реализация .Net. (+ Perl, Ruby и, возможно, другие. Приятно иметь единую парадигму, применимую ко всем этим! Изучите один раз, используйте везде!)

dsz
13 Авг 2015 в 23:22

Просто передайте и в качестве аргументов функции, в которой вы хотите их обработать.

2

tomahh
12 Окт 2012 в 15:54

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

Который никогда не был действительным C или C ++, но вместо этого напишите

При этом ваш код может компилироваться, например, с (с обычными параметрами компилятора).

Учитывая , я подозреваю, что это среда Windows. В любом случае, для поддержки использования вашей программы в среде Windows вам не следует использовать аргументы в Windows. Они работают в * nix, потому что были разработаны в этой среде и для нее; они, как правило, не работают в Windows, потому что по умолчанию (по очень строгому соглашению) они кодируются как Windows ANSI, что означает, что они не могут кодировать имена файлов с символами вне текущей локали пользователя.

Поэтому для Windows лучше использовать функция API и ее родственная функция синтаксического анализа. Для переносимости его лучше инкапсулировать в какой-нибудь модуль аргументов командной строки. Затем вам нужно решить интересную проблему использования в Windows и в * nix…

В любом случае, я не уверен в соответствующем * nix API, или даже если он есть, но погуглите. В худшем случае для * nix вы всегда можете инициализировать модуль аргументов командной строки из . Уродство для * nix напрямую связано с необходимостью поддержки переносимости с помощью самой непереносимой, специфичной для ОС конструкции C ++, а именно стандартной .

4

S.S. Anne
2 Янв 2020 в 22:39

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Мой редактор ОС
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: