- Главная
- Информатика
- Функции для разбора списка переданных опций
Содержание
- 2. Функция getopt() #include int getopt( int argc, /* число параметров программы*/ char * const argv[], /*
- 3. optstring - строка, содержащая допустимые символы опций. Если за символом опции в строке стоит двоеточие, то
- 4. При каждом повторном вызове getopt() возвращаются символы следующей опции. Если getopt() находит символ опции, она возвращает
- 5. #include #include #include int main (int argc, char *argv[]) { int c; char* s[2] = {"Hello","By"};
- 6. nt@nata-pc:~$ ./getoptexample Hello, Incognito nt@nata-pc:~$ ./getoptexample -h Wrong option h nt@nata-pc:~$ ./getoptexample -g Hello, Incognito nt@nata-pc:~$
- 7. Функции getopt_long() и getopt_long_only() #define _GNU_SOURCE #include int getopt_long( int argc, char * const argv[], const
- 8. longopts является указателем на первый элемент массива структур struct option, указанного в следующим образом struct option
- 9. #include #include #define _GNU_SOURCE #include int main (int argc, char *argv[]) { int c; char* s[2]
- 11. Скачать презентацию
Слайд 2Функция getopt()
#include
int getopt(
int argc, /* число параметров программы*/
char
Функция getopt()
#include
int getopt(
int argc, /* число параметров программы*/
char
![Функция getopt() #include int getopt( int argc, /* число параметров программы*/ char](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/976777/slide-1.jpg)
const char *optstring /* строка с допустимыми символами опций. */
);
extern char *optarg; /* указатель аргумент опции, если таковой имеется */
extern int optind, /* индекс указателя argv, который будет обработан при следующем вызове getopt() */
opterr, /* управление выводом сообщений об ошибках*/
optopt; /* текущая опция*/
Слайд 3optstring - строка, содержащая допустимые символы опций.
Если за символом опции в
optstring - строка, содержащая допустимые символы опций.
Если за символом опции в
![optstring - строка, содержащая допустимые символы опций. Если за символом опции в](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/976777/slide-2.jpg)
Два двоеточия означают, что опция имеет необязательный аргумент (дополнение GNU).
Если optstring содержит W, за которой следует точка с запятой, то -W foo рассматривается как длинная опция --foo.
Если первым символом optstring является "+" или задана переменная окружения POSIXLY_CORRECT, то обработка опций прерывается на первом аргументе, не являющемся опцией.
Если первым символом optstring является "-", то каждый элемент argv, не являющийся опцией, обрабатывается так, как если бы он был аргументом опции с символом, имеющим код 1.
Слайд 4При каждом повторном вызове getopt() возвращаются символы следующей опции. Если getopt() находит
При каждом повторном вызове getopt() возвращаются символы следующей опции. Если getopt() находит
![При каждом повторном вызове getopt() возвращаются символы следующей опции. Если getopt() находит](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/976777/slide-3.jpg)
Если символов опций больше нет, то getopt() возвращает -1. При этом optind станет индексом первого элемента argv, не являющегося опцией (getopt() переставляет элементы содержимого argv в процессе поиска, так что все аргументы, не являющиеся опциями, оказываются в конце).
Если getopt() не распознал символ опции, то он выводит на стандартный поток ошибок соответствующее сообщение, заносит символ в optopt и возвращает "?". Вызывающая программа может предотвратить вывод сообщения об ошибке, установив нулевое значение opterr.
Если функция getopt() обнаружит в argv символ опции, не найденный в optstring, или если она обнаружит пропущенный аргумент опции, то она возвратит `?' и занесет во внешнюю переменную optopt действительный символ опции. Если первым символом optstring является двоеточие (`:'), то для сообщения о пропущенном аргументе опции getopt() возвратит `:' вместо `?'. Если при обнаружении ошибки первый символ optstring не является двоеточием и внешняя переменная opterr не равно нулю (по умолчанию так и есть), то getopt() выведет сообщение об ошибке.
Слайд 5#include
#include
#include
int main (int argc, char *argv[])
{
int c;
#include
#include
#include
int main (int argc, char *argv[])
{
int c;
![#include #include #include int main (int argc, char *argv[]) { int c;](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/976777/slide-4.jpg)
char nm[] = "Incognito";
struct globalArgs_t {
int helloby; /* опция –g (-b) */
char *name; /* опция -n */
int errflag;
} globalArgs = {0,nm,0};
while ((c=getopt (argc,argv,":gbn:")) != -1)
switch (c)
{
case ‘g' : globalArgs.helloby = 0; break;
case 'b' : globalArgs.helloby = 1; break;
case 'n' : globalArgs.name = optarg; break;
case '?' : globalArgs.errflag =1; printf("Wrong option %c\n", optopt); break;
case ':' : globalArgs.errflag =1; printf("Option %c is missed\n", optopt); break;
}
if (globalArgs.errflag == 1)
return EXIT_FAILURE;
printf("%s, %s", s[globalArgs.helloby],globalArgs.name);
if (optind < argc)
printf("\nOther arguments:\n");
for ( ; optind < argc; optind++)
printf("%s ", argv[optind]);
printf("\n");
return EXIT_SUCCESS;
}
Слайд 6nt@nata-pc:~$ ./getoptexample
Hello, Incognito
nt@nata-pc:~$ ./getoptexample -h
Wrong option h
nt@nata-pc:~$ ./getoptexample -g
Hello, Incognito
nt@nata-pc:~$ ./getoptexample -b
By,
nt@nata-pc:~$ ./getoptexample
Hello, Incognito
nt@nata-pc:~$ ./getoptexample -h
Wrong option h
nt@nata-pc:~$ ./getoptexample -g
Hello, Incognito
nt@nata-pc:~$ ./getoptexample -b
By,
![nt@nata-pc:~$ ./getoptexample Hello, Incognito nt@nata-pc:~$ ./getoptexample -h Wrong option h nt@nata-pc:~$ ./getoptexample](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/976777/slide-5.jpg)
nt@nata-pc:~$ ./getoptexample -b -h
Wrong option h
nt@nata-pc:~$ ./ getoptexample -b -g -n
Option n argument is missed
nt@nata-pc:~$ ./getoptexample -b -g
By, Incognito
nt@nata-pc:~$ ./getoptexample -b -g -nGroup
By, Group
nt@nata-pc:~$ ./getoptexample -b -g -nGroup fff
By, Group
Other arguments:
fff
nt@nata-pc:~$ ./getoptexample ddd ddd sss -b -g -nGroup
By, Group
Other arguments:
ddd ddd sss
Слайд 7Функции getopt_long() и getopt_long_only()
#define _GNU_SOURCE
#include
int getopt_long(
int argc,
char *
Функции getopt_long() и getopt_long_only()
#define _GNU_SOURCE
#include
int getopt_long(
int argc,
char *
![Функции getopt_long() и getopt_long_only() #define _GNU_SOURCE #include int getopt_long( int argc, char](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/976777/slide-6.jpg)
const char *optstring,
const struct option *longopts,
int *longindex
);
int getopt_long_only(i
int argc,
char * const argv[],
const char *optstring,
const struct option *longopts,
int *longindex
);
Функция getopt_long() работает так же, как getopt(), за исключением того, что она воспринимает и длинные опции, начинающиеся с двух дефисов. Длинные опции можно сокращать, если сокращение сохраняет уникальность опции или полностью совпадает с одной из определенных опций. Длинная опция может иметь параметр вида --опция=параметр или --опция параметр.
Функция getopt_long_only() работает так же, как getopt_long(), но в качестве указателя длинной опции может служить не только "--", но и "-". Если опция, начинающаяся с "-" (не с "--"), не совпадает с длинной опцией, но совпадает с короткой, то она обрабатывается как короткая опция.
Слайд 8longopts является указателем на первый элемент массива структур struct option, указанного в
longopts является указателем на первый элемент массива структур struct option, указанного в
![longopts является указателем на первый элемент массива структур struct option, указанного в](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/976777/slide-7.jpg)
struct option {
const char *name;
int has_arg;
int *flag;
int val;
};
Значения различных полей:
name - имя длинной опции.
has_arg может быть:
no_argument (или 0), если опция не имеет аргумента;
required_argument (или 1), если опция требует указания аргумента;
optional_argument (или 2), если опция может иметь необязательный аргумент.
flag задает способ возвращения результатов для длинной опции. Если flag равен NULL, то getopt_long() возвращает val. Hапример, вызывающая программа может назначить val эквивалентом символа короткой опции. В противном случае getopt_long() возвращает 0, а flag указывает на переменную, устанавливаемое значение которой равно val, если опция найдена; и оставляемую без изменений, если опция не найдена.
val является возвращаемым значением или загружается в переменную, на которую указывает flag.
Последний элемент массива должен быть заполнен нулями.
Если longindex не содержит NULL, то он является указателем на переменную, содержащую индекс длинной опции в соответствии с longopts.
Слайд 9#include
#include
#define _GNU_SOURCE
#include
int main (int argc, char *argv[])
{
int c;
#include
#include
#define _GNU_SOURCE
#include
int main (int argc, char *argv[])
{
int c;
![#include #include #define _GNU_SOURCE #include int main (int argc, char *argv[]) {](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/976777/slide-8.jpg)
char* s[2] = {"Hello","By"};
char nm[] = "Incognito";
struct globalArgs_t {
int helloby; /* опция –g (-b) */
char *name; /* опция -n */
int errflag;
} globalArgs = {0,nm,0};
struct option long_options[] = {
{ "hello", no_argument, 0, 'g' },
{ "by", no_argument, 0, 'b' },
{ "name", required_argument, 0, 'n' },
{NULL,0,NULL,0}
};
int option_index = 0;
while ((c=getopt_long(argc,argv,":gbn:",long_options, &option_index )) != -1)
switch (c)
{
case 'g' : globalArgs.helloby = 0; break;
case 'b' : globalArgs.helloby = 1; break;
case 'n' : globalArgs.name = optarg; break;
case '?' : globalArgs.errflag =1; printf("Wrong option %c\n", optopt); break;
case ':' : globalArgs.errflag =1; printf("Option %c argument is missed\n", optopt); break;
}
if (globalArgs.errflag == 1)
return EXIT_FAILURE;
printf("%s, %s", s[globalArgs.helloby],globalArgs.name);
if (optind < argc)
printf("\nOther arguments:\n");
for ( ; optind < argc; optind++)
printf("%s ", argv[optind]);
printf("\n");
return EXIT_SUCCESS;
}