Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курс ПЯВУ 2 сем / Лекции 2 сем / Л№35.Аргументы кс / Лекция № 30.Аргументы командной строки..odt
Скачиваний:
12
Добавлен:
17.04.2015
Размер:
58.31 Кб
Скачать

9. Опции Программ Синтаксического анализа

Имеются подробности относительно того, как вызвать getopt функцию. Чтобы использовать это средство, ваша программа должна включить заглавный файл " unistd.h ".

int opterr (переменная)

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

int optopt (переменная)

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

int optind (переменная)

Эта переменная будет установлена getopt как индекс следующего элемента массива argv, который будет обработан. Если getopt нашла все аргументы-опции, Вы можете использовать эту переменную, чтобы определить, где начинаются остающиеся аргументы-не-опции. Начальное значение этой переменной 1.

char * optarg (переменная)

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

int getopt (int argc, char **argv, const char *options) (функция)

Getopt функция получает следующий аргумент-опцию списка параметров, заданного argv и argc аргументами.

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

Если строка аргумента-опции начинается с дефиса (" - "), она обрабатывается особенно. Это разрешает аргументам-не-опциям, возвращаться, как будто они были связаны с последним символом опции.

Getopt функция возвращает символ опции для следующей опции командной строки. Когда нет больше аргументов-опций, она возвращает -1. Может все еще иметься большое количество аргументов-не-опций; Вы должны сравнить внешнюю переменную optind c параметром argc, чтобы проверить это.

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

Если getopt находит символ опции в argv, который не был включен в опции, или отсутствующий аргумент некоторой опции, она возвращает "? ", устанавливает внешнюю переменную optopt как фактический символ опции. Если первый символ опции - двоеточие (":"), то getopt возвращает ":" вместо "? " Чтобы указать отсутствующий аргумент опции. Кроме того, если внешняя переменная opterr отлична от нуля (который является значением по умолчанию), getopt печатает сообщение об ошибках.

Пример Синтаксического Анализа Аргументов с getopt

Вот пример, показывающий, как getopt обычно используется:

#include <unistd.h>

#include <stdio.h>

int

main (int argc, char **argv)

{

int aflag = 0;

int bflag = 0;

char *cvalue = NULL;

int index;

int c;

opterr = 0;

while ((c = getopt (argc, argv, "abc:")) != -1)

switch (c)

{

case 'a':

aflag = 1;

break;

case 'b':

bflag = 1;

break;

case 'c':

cvalue = optarg;

break;

case '?':

if (isprint (optopt))

fprintf (stderr, "Unknown option

`-%c'.\n", optopt);

else

fprintf (stderr, "Unknown option

character `\\x%x'.\n", optopt);

return 1;

default:

abort ();

}

printf ("aflag = %d, bflag = %d, cvalue = %s\n",

aflag, bflag, cvalue);

for (index = optind; index < argc; index++)

printf ("Non-option argument %s\n",

argv[index]);

return 0;

}

Имеются некоторые примеры, показывающие, что эта программа печатает с различными комбинациями аргументов:

% testopt

aflag = 0, bflag = 0, cvalue = (null)

% testopt -a -b

aflag = 1, bflag = 1, cvalue = (null)

% testopt -ab

aflag = 1, bflag = 1, cvalue = (null)

% testopt -c foo

aflag = 0, bflag = 0, cvalue = foo

% testopt -cfoo

aflag = 0, bflag = 0, cvalue = foo

% testopt arg1

aflag = 0, bflag = 0, cvalue = (null)

Non-option argument arg1

% testopt -a arg1

aflag = 1, bflag = 0, cvalue = (null)

Non-option argument arg1

% testopt -c foo arg1

aflag = 0, bflag = 0, cvalue = foo

Non-option argument arg1

% testopt -a -- -b

aflag = 1, bflag = 0, cvalue = (null)

Non-option argument -b

% testopt -a

aflag = 1, bflag = 0, cvalue = (null)

Non-option argument