Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции_СП_2004_1_00.doc
Скачиваний:
69
Добавлен:
04.11.2018
Размер:
882.69 Кб
Скачать

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

Те, кому хоть раз приходилось работать в операционной среде MS DOS, видимо обратили внимание на то, что большинство команд пользовательского интерфейса могут иметь один или более параметров, называемых аргументами командной строки. Так, например, обращение к команде copy, выполняющей копирование файлов, обычно выглядит следующим образом:

copy oldfile.txt newfile.txt

где параметры oldfile.txt и newfile.txt определяют имена файла-источника и файла-приемника соответственно. Эти параметры обрабатываются командным процессором и передаются в тело программы copy, в результате чего последняя узнает о файлах, над которыми должна быть выполнена операция копирования. Можно с уверенностью сказать, что именно наличие параметров делает всевозможные команды удобными для практического использования. Поскольку язык Си часто применяется при разработке системного программного обеспечения, он имеет встроенные средства для получения аргументов команды непосредственно от командного процессора. Такая возможность, на первый взгляд кажущаяся несколько необычной, в действительности находится в полном соответствии с архитектурой этого языка. В самом деле, любая функция, входящая в состав Си-программы, может иметь параметры, через которые она получает необходимую информацию от вызывающей ее функции. Совершенно аналогично, главная функция main(), с которой начинается выполнение всякой программы, могла бы в момент вызова получать исходные данные через аргументы командной строки. Для этого достаточно снабдить функцию main() набором параметров, которые обычно имеют имена argc и argv:

main(argc, argv)

Параметр argc (ARGument Count) является переменной типа int, получающей от командного процессора информацию о количестве аргументов, набранных в командной строке, включая и имя самой команды. Второй параметр argv (ARGument Vector) обычно определяется как массив указателей типа char, каждый из которых хранит адрес начала отдельного слова командной строки. Их описание в программе может выглядеть следующим образом:

int argc;

char *argv[];

В соответствии с принятым соглашением, нулевой элемент argv[0] массива указателей ссылается на строку символов, содержащую имя самой команды и поэтому параметр argc всегда имеет значение большее или равное единице. Следующий элемент argv[1] задает адрес размещения в памяти первого аргумента команды, также представленного последовательностью символов, и т. д. Обращаясь к очередному элементу массива argv нетрудно получить доступ ко всем аргументам командной строки. В качестве примера, иллюстрирующего работу с параметрами функции main(), рассмотрим программу, выводящую на экран терминала свои собственные аргументы и реализующую команду echo в составе оболочки операционной системы MS DOS:

#include <stdio.h>

main(argc, argv)

int argc;

char argv[];

{ int i;

for (i = 1; i <= argc; i++)

printf("%s%c", argv[i], (i < argc-1) ? ' ' : '\n');

}

Поместив теперь загрузочный модуль этой программы в файл echo.exe и обратившись к ней при помощи команды

C:\> echo first second third

получим на экране терминала такое сообщение

first second third

C:\>

представляющее собой простое эхо аргументов командной строки. Поскольку массив указателей в определенном смысле эквивалентен "указателю на указатель" (см. Лекцию 4, $ 3), мы могли бы определить переменную argv в заголовке функции main() как косвенный указатель типа char:

char **argv;

что полностью равносильно предыдущему описанию. В этих терминах наша программа echo могла бы выглядеть, например, следующим образом:

#include <stdio.h>

main(argc, argv)

int argc;

char **argv;

{ while (--argc > 0)

printf((argc > 1) ? "%s " : "%s\n", *++argv);

}

где выражение ++argv увеличивает на единицу значение указателя, заставляя его ссылаться на очередную строку, полученную от командного процессора.