Аргументы и опции программы

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

Прототипы головной функции (по стандарту):

int main (int argc, char ** argv, char ** envp)

int main (int argc, char ** argv)

Запуск программы:

>prog1 PAR1 PAR2 PAR3 <Enter>

argc = 4

argv[0] = “prog1”

argv[1] = “PAR1”

argv[2] = “PAR2”

argv[3] = “PAR3”

argv[4] = NULL

Механизм опций позволяет разделить все элементы программы на следующие категории:

1) сама опция: -о; -е //обычно присутствует дефис

многосимвольные опции имеют два дефиса: --Lim

2) зависимые аргументы

>gcc –o prog1.out prog1.c

предполагают наличие аргумента: -о <аргумент>

3) свободные аргументы

>gcc –o prog1.out prog1.c

не связаны напрямую с опциями

Функция обработки коротких опций:

#include <getopt.h>

int getopt (int argc, char ** argv, const char * opts);

Первые два аргумента – аргументы функции main, которые получает программа. Третий аргумент – строка, которая является перечнем опций, используемых программой (без разделений и дефисов). Если после имени опции стоит:,то следующая опция является зависимым аргументом.

Пример: ab:c

Используемые опции:

-a

-b, которая требует –с.

Обработка опций программы подразумевает неоднократный вызов функции getopt, которая возвращает код очередного фактического аргумента. Если пользователь ввел опцию, которая не указана в перечне, то возвращается?, если все опции уже обработаны – функция возвращает -1

#include <stdio.h>

#include <getopt.h>

int main (int argc, char ** argv) {

FILE * outfile = stdout;

int i, opt;

char * filename = NULL;

char help_str[] = {“/формат вызова: getoptdemo[OPT] ARGS\n”,

“-h -вызов помощи\n”,

“-o <outfile> -запись в файл \n”};

while ((opt = getopt (argc, argv, “ho:”))!= 1) {

switch (opt) {

case ‘h’: printf(“%s”, help_str); return (0);

case ‘o’: filename = optarg; break;

case ‘?’: printf(“%s”, help_str); return (0);

default: printf(“Неизвестная ошибка\n”); return(1);

}

}

if (optind >= argc) {

printf (“Нет аргумента\n”);

return (1);

}

if (filename!= NULL) {

outfile = fopen (filename, “w”);

if (outfile == NULL) {

printf (“файл не открыт\n”);

return (-1);

}

}

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

fprintf (outfile, “%s\n”, argv[i]);

if (outfile!= stdout)

fclose(outfile);

return (0);

}


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: