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

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

Прошу под кат.

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


Первый аргумент — это количество аргументов переданных в программу(arguments counter), причем имя программы тоже учитывается. Второй аргумент — это массив(из строк) значений аргументов(arguments values), последний элемент массива равен NULL.

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

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

Результат:

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

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

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

NAME = value

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

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

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

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

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

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

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

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

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

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

Функция AppendChar добавляет символ в конец строки. В стандартной библиотеки такой функции не было, поэтому я написал свою:

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

Все на самом деле очень просто.

Спрашивайте свои ответы. Пишите пожелания, просьбы. Указывайте на мои ошибки.

Удачи!

Комментарии 1

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

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