Аргументы функции main()


Функция main. Аргументы и возвращаемое значение

В этой теме 1 ответ, 2 участника, последнее обновление 3 года/лет, 3 мес. назад.

У функции main() в языке С++ есть два аргумента — argc и argv , кроме того она возвращает целое число. Почему в качестве возвращаемого значения обычно используют ноль, но часто вообще ничего не возвращают (и компилятор не ругается)? Зачем все это нужно и почему часто эту функцию используют без аргументов?

Аргументы функции main используются для передачи данных в приложение через командную строку или от других приложений. Эту технологию используют все системные утилиты в любой операционной системе, а также, например, инструменты программиста (компилятор, отладчик, компоновщик и т.п.). Чтобы скомпилировать файл main.cpp — вы можете написать:
g++ main.cpp -o main
При этом запустится программа g++ (в Windows g++.exe ) и ей на вход будет передано три аргумента — «main.cpp» , «-o» , «main» . Программа анализирует не только сами аргументы, но и их порядок.

Итак, у функции main() может быть два аргумента — первый отвечает за количество полученных параметров (обычно называют argc ), а второй представляет собой массив параметров ( argv ). Вне значения, переданные в программу, внутри рассматриваются как символьные строки — тип argv — char*[argc+1] .

Даже если не передавать программе никаких значений — argc будет равен единице, т.к. argv[0] всегда содержит имя запущенной программы. Последний элемент массива параметров ( argv[argc] ) всегда равен нулю — это может использоваться при переборе параметров.

Часто делают так, что при запуске программы без аргументов она начинает диалог с пользователем, но если аргументы переданы — то использует их (не задает лишних вопросов):

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

На снимке экрана используется стандартная в UNIX команда cat , выводящая на экран содержимое файла.

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

Программа может перебирать аргументы как элементы массива, однако зачастую пользователь передает в качестве значений числа — преобразовать строку в число можно, например, с помощью sscanf или std::stringstream .

В последнем примере функция main() возвращает значение. Значением всегда является целое число, которое обрабатывается операционной системой — процесс, завершающийся с кодом ноль отработал без ошибок, во всех остальных случаях операционная система знает что произошла какая-то ошибка (при этом значения могут быть любыми, на них нет никакого стандарта). Нулевое значение функция main() вернет автоматически (при нормальном завершении программы) — это зафиксировано стандартом языка, все остальные значения рекомендуется именовать при помощи констант или перечислений ( enum ).

Зачем нужны аргументы в функции main

25.05.2011, 16:22

Аргументы функции main
Что бы объединить аргументы в одну строку я написла такой код. Подскажите может есть уже готовая.

Зачем функции main тип void?
Собственно сабж. Просто не понятно, мы в майне пишем return 0, а для этого вроде бы как не нужен.

Создание функции, формирующую предложение из аргументов функции, аргументы . Аргументы — переменное число
Короче, вот бы всё норм. Хочу соединять, но он мне выдаёт ошибку, когда использую strcat. Не могу.

Аргументы main — пояснить природу ошибки
#include «stdafx.h» #include #include #include #define.

Вывести имя и все аргументы main, которые передаются
Доброго времени суток, есть такая программа: #include int main(int argc, char.

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

Содержание

Аргументы командной строки [ править ]

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

Пример 1 [ править ]

Например стандартная программа ‘ls’ в Linux в качестве аргумента принимает имена директорий, содержимое которых нужно вывести в стандартный поток вывода. Команда

выведет содержимое директории ‘/home/user’.

Команда ‘ls’ имеет множество опций, которые можно передавать в командной строке. О них вы можете узнать, запустив команду ‘ls’ с опцией ‘-h’:

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


  • аргументы командной строки;
  • стандартный поток ввода;
  • файлы;
  • средства взаимодействия процессов (signals, sockets, messages, . ).

Научимся использовать первый из них.

Подробнее об аргументах командной строки [ править ]

Основной функцией в программе на языке Си является функция main() . Мы уже познакомились с простейшим способом объявления этой функции:

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

При такой записи, при вызове вашей программы, параметр argc будет содержать количество параметров командной строки плюс один. Действительные параметры нумеруются с единицы по argc-1 включительно (т.е. всего argc-1 параметров), параметр под номером ноль является служебным — он содержит полный путь и имя исполняемого файла вашей программы.

Для доступа к параметру под номером i следует писать argv[i] . Выражение argv[i] — это строка, передаваемая в соответствии с соглашениями языка Си о строках. С ней можно проделывать все операции, как с обычной строкой (её даже можно модифицировать, но это считается дурным тоном!).

Илон Маск рекомендует:  Протокол отладчика

Вот еще один пример программы, работающей со своей командной строкой:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Теперь, при запуске 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 ) следующим образом:

Аргументы функции main

Здравствуйте, меня интересует main функция с параметрами, часто вижу запись в чужых исходниках, да и в своих (пишу эту часть неосознанно)

Как эти параметры передаются в функцию при ее вызове и что они вобще значат, спасибо.

5 ответов 5

Это параметры, которые передаются программе при запуске.

argc — количество этих параметров. argv — указатель на массив указателей на строки, каждая из которых содержит один параметр. Параметры передаются в виде строк Си. Еще бывает такая запись — char* argv[]

В структуре памяти процесса Линукса они находятся в стеке сразу за стеком функции main. Думаю, в других системах то же устройство.

Вам тут показали на примерах. Забыли правда про третий параметр main() ссылку на вектор переменных окружения ОС (environment, те, которые в Shell устанавливаются командой export).

Почитайте также man execl.

Это стандртная вещь в C/C++

  • argc — количество аргументов в командной строке
  • *argv[] — массив указателей на строки, содержащие эти аргументы

При этом argv[0] — это имя команды, а argv[argc] — это NULL.

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

myprog param1, param2, param3

Соответственно в main() вы получите:

При этом если при завершении проги вы вернете в main() return 2; то ось получит exit code равное 2 (в Windows это называется errorlevel )

Update Спорол лажу с примером — исправляю:

Илон Маск рекомендует:  Что такое код disable

myprog param1 param2 param3

Аргументы функции main() и переменные окружения

Функция main — это основная точка входа в программу. Именно с нее начинается выполнение программы. Ей можно передавать аргументы. Если вы работали с консолью, не важно в windows или unix системах, то вы знаете, что программам можно передавать какие-то значения. Эти значения записываются в аргументы функции main, если они объявлены, иначе просто будут проигнорированы. Стандарт ANSI говорит нам объявлять функцию main следующим образом:


Примечание: возвращаемое значение указывает на код ошибки, или равно нулю — если все прошло успешно. Но опять таки, все зависит от используемого стандарта, ОС и прочих факторов.

Теории хватит, потренеруемся. Напишем программу которая сообщит количество переданных параметров:

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

Функция atoi преобразовывает строковое значение в int. А дальше все просто.

Теперь немного о среде окружения. Переменные окружения имеют следующий вид:

NAME = value

Где name — имя, а value — значение(странно, правда?). Хранятся они в массиве строк. Называется он environ. Его нужно объявить как внешнюю переменную типа char**.

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

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

Теперь ознакомимся с двумя функциями:

Они нам понадобятся для более сложного задания. Перейдем сразу к нему. И так, нам необходимо создать переменную ENVVARS со значением всех имен переменных окружения и их значениями. Между именем и значением используется разделитель ‘-‘, а между парами «имя-значение» — ‘;’. Напишем сначала две функции, первая будет вытаскивать из строки переменной окружения ее имя:

Принцип простой. Выделяем для нашей строки память размером с входящую строку, так точно хватит. После начинаем перебирать входящую строку, пока не встретим ‘=’, при этом копируем каждый символ в нашу результирующую строку. По достижении символа ‘=’ выходим из цикла, и присваиваем символу результирующей строки под номером i символ конца строки. Строка готова!

Теперь аналогичную, но только для значения:

Немного сложнее. Сначала ищем номер символа ‘=’. Нашли — увеличиваем переменную с номером(i) на единицу. Создаем новую переменную j. Начинаем цикл, в котором перебираем j, и увеличиваем переменную i. Каждому символу результирующей строки с номером j присваиваем символ входящей строки с номером i. И так пока не встретим символ конца строки в input. После присваиваем символу результирующей строки с номером j — ‘=’. Строка готова.

Примечание: функции можно было бы упростить, используя string.h. В нем объявлены функции для поиска номера символа в строке и т.д.. Так же можно было бы использовать getenv. Но для более глубокого понимания, следует уметь переписать всю стандартную библиотеку самостоятельно! Только работа с памятью, только хардкор!

Теперь можно приступить к написанию самой программы. Функция main будет выглядеть так:

Аргументы функции main()

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

Здесь мы исследуем нашу собственную командную строку. Напишем простую программу, копирующую командную строку в буфер размером 256 байтов.

Лст. 5-1. Копирование командной строки в текстовый буфер.

Алгоритм здесь исходит из типа второго аргумента – указателя на указатель. Тот же результат может быть получен записью: char **argv Попробуйте сами.

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

Лст. 5-2. Интерпретация метасимволов оболочкой.

Из результата можно сделать выводы, что нулевым аргументом является имя самой программы. Кроме того, мы видим, что некоторые символы приводят оболочку в негодование. Это метасимволы. В таком контексте (командной строки), они видятся не как обычные символы. Так, круглые скобки используются для запуска команд в дочерней оболочке. Если мы хотим, все-таки, затолкать их в командную строку, то надо или экранировать их слешем, или взять всю строку в кавычки:

Лст. 5-3. Экранирование метасимволов.

Звездочка – это тоже метасимвол, глоб. Если не использовать экранирования звездочки слешем, то вместо нее будет подставлен перечень файлов текущего каталога. Правильно экранированные метасимволы попадают в строку как обычные символы. Кавычки вообще избавляют от необходимости что-то экранировать.

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

Лст. 5-4. Удаление лишних пробелов.


Думаю, читателям уже все ясно. Давайте попробуем написать простую, но полезную программу, используя изученные свойства функции main. Кстати, их обеспечивает нам наша библиотека времени выполнения, ctr0.o. Будь она написана чуть проще, аргументы main были бы нам недоступны.

Напишем простую программу detab. Хочу напомнить, если не делал этого раньше: каждый раз, когда мы выбираем имя name для новой программы, следует проверять его командой which name. Чтобы получить гарантию, что программы с таким именем нет в системе, и не смущаться ее неожиданным поведением. Наиболее частый пример: test. Можно, конечно, использовать в таком случае команду: ./test, но удобно ли это? На всякий случай, напоминаю.

Илон Маск рекомендует:  Что такое код jdtogregorian

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

Лст. 5-5. Логика разбора командной строки.

Тот факт, что получить сами аргументы из командной строки несложно, никак не отменяет возможной сложности их разбора в общем случае. Пользователь – это произвольное множество клавиш, посылаемых в программу. Мы, в любом случае, должны отреагировать на них без ошибок. Слишком простая программа, полагающаяся на «само собой разумеющийся» ввод, тупо окажется глючной. Именно так и работают «девелоперы»-гуманитарии.

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

Докажем, что код в листинге удовлетворяет условиям. Первый оператор if отбрасывает все случаи, когда число аргументов меньше 1 и больше 2. Аргументов не может быть меньше 1 – это само имя main. Следовательно, остается проверить случай argc == 2, и, если это так, дополнительно решить целочисленное неравенство: 0

Функция main()

Язык
Заголовочные файлы
Концепты
Поддержка языка
Ошибка
Утилиты
Строки
Контейнеры
Алгоритмы
Итераторы
Работа с числами
Ввод/вывод
Локализация
Регулярные выражения (C++11)
Атомарные операции (C++11)
Потоки (C++11)
Файловая система (C++17)
Технические спецификации
ключевые слова
фазы трансляции
комментарии
функция main()
имена и идентификаторы
типы
фундаментальные типы
объекты
область видимости
время жизни объекта
storage duration and linkage
определения и ODR
разрешение имён
qualified name lookup
unqualified name lookup
модель памяти

Программа должна иметь глобальную функцию main — точку старта программы.

int main () <body > (1)
int main ( int argc , char * argv [ ] ) <body > (2)
int main ( int argc , char * argv [ ] , other_parameters ) <body > (3)
argc Неотрицательное число — количество аргументов, переданных программе из окружения, в котором запустили программу.
argv Указатель на первый элемент массива указателей на многобайтовые строки с завершающим нулем, аргументы, переданных программе из окружения, в котором запустили программу (с argv [ 0 ] по argv [ argc — 1 ] ). Гарантируется, что последний элемент массива argv [ argc ] — нулевой указатель ​ 0 ​ .
body Тело функции main.
other_parameters Различные реализации допускают дополнительные формы функции main, но при этом возвращаемый тип всегда int . Наиболее часто третьим аргументом передают массив char*[] указателей на значения переменных окружения.

Имена argc и argv могут быть произвольными, так же как и запись типов этих параметров: int main ( int ac, char ** av ) так же допустимо.

[править] Объяснение

Функция main вызывается при старте программы после инициализации нелокальных объектов со статической длительностью хранения. Это точка входа в программу, которая исполняется в гостевом окружении (то есть с операционной системой). Точки входа в автономные программы (boot loaders, OS kernels, и т.п.) зависят от реализации.

Параметры функции main в варианте с двумя параметрами позволяют передать произвольные многобайтовые строки из окружения выполнения (обычно это аргументы командной строки), указатели argv[1] .. argv[argc-1] ссылаются на первые символы этих строк. argv[0] — указатель на первый символ многобайтовой строки с завершающим нулём, которая содержит имя, используемое при вызове программы (или пустую строку «» , если это не поддерживается в окружении выполнения). Эти строки изменяемые, хотя их изменения не распространяются назад в окружение выполнения: они могут использоваться, например, в std::strtok . Размер массива, на который указывает argv , равен по меньшей мере argc+1 , и последний элемент массива argv[argc] гарантированно является null-указателем.

Функция main обладает следующими специальными свойствами:

[править] Примечания

То, как аргументы, приведенные в командной строке ОС, преобразуются в массивы многобайтовых строк, на которые ссылается argv , определяется реализацией обработки командной строки:

Аргументы функции main() в поиске файлов

Я пишу код, который должен искать строку символов в данных текстовых файлах. Когда аргумент не указан, вы получаете информацию, в которой он возвращает информацию, которую вы даете, по крайней мере, одному аргументу. Если вы даете программе только один аргумент, который является строкой символов, чтобы найти, вам нужно написать, сколько файлов вы хотите искать. Следующий шаг — указать путь для этих файлов. Проблема в том, что вы пишете несколько. Последний путь проверяется только. Первый цикл показал, что пути назначены хорошо, но printf после цикла показывает, что что-то пошло не так. Что я должен изменить в этом коде? Код добавлен ниже. За любую помощь большое спасибо.

Вы не должны изменять контент или argv argv — это континентный массив указателя.

Аргументы функции main

Здравствуйте, меня интересует main функция с параметрами, часто вижу запись в чужых исходниках, да и в своих (пишу эту часть неосознанно)

Как эти параметры передаются в функцию при ее вызове и что они вобще значат, спасибо.

Это параметры, которые передаются программе при запуске.

argc — количество этих параметров. argv — указатель на массив указателей на строки, каждая из которых содержит один параметр. Параметры передаются в виде строк Си. Еще бывает такая запись — char* argv[]

В структуре памяти процесса Линукса они находятся в стеке сразу за стеком функции main. Думаю, в других системах то же устройство.

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL