Каждая программа обрабатывает переданные ей аргументы в соответствии со своим алгоритмом работы. Для унифицирования интерфейса передачи аргументов используется механизм опций.
Прототипы головной функции (по стандарту):
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);
}