Параметры командной строки в C - хотел бы, чтобы шаблон работал [дубликат]

  Публичная функция getWeb (ByRef sURL As String) As String Dim myWebClient As New System.Net.WebClient () Попробуйте отключить myCredentialCache как новый System.Net.CredentialCache () Dim myURI As New Uri (sURL) myCredentialCache.  Добавить (myURI, «ntlm», System.Net.CredentialCache.DefaultNetworkCredentials) myWebClient.Encoding = System.Text.Encoding.UTF8 myWebClient.Credentials = myCredentialCache Возвращает myWebClient.DownloadString (myURI) Catch ex As Exception Возврат «Исключение» & amp;  ex.ToString () End Try End Function  
63
задан user1251020 10 March 2012 в 04:10
поделиться

12 ответов

    /*
      Here's a rough one not relying on any libraries.
      Example:
      -wi | -iw //word case insensitive
      -li | -il //line case insensitive
      -- file  //specify the first filename (you could just get the files
      as positional arguments in the else statement instead)
      PS: don't mind the #define's, they're just pasting code :D
    */
    #ifndef OPT_H
    #define OPT_H

    //specify option requires argument
    #define require \
      optarg = opt_pointer + 1; \
      if (*optarg == '\0') \
      { \
        if (++optind == argc) \
          goto opt_err_arg; \
        else \
          optarg = argv[optind]; \
      } \
      opt_pointer = opt_null_terminator;

    //start processing argv
    #define opt \
    int   optind                 = 1; \
    char *opt_pointer            = argv[1]; \
    char *optarg                 = NULL; \
    char  opt_null_terminator[2] = {'\0','\0'}; \
    if (0) \
    { \
      opt_err_arg: \
        fprintf(stderr,"option %c requires argument.\n",*opt_pointer); \
        return 1; \
      opt_err_opt: \
        fprintf(stderr,"option %c is invalid.\n",*opt_pointer); \
        return 1; \
    } \
    for (; optind < argc; opt_pointer = argv[++optind]) \
      if (*opt_pointer++ == '-') \
      { \
        for (;;++opt_pointer) \
          switch (*opt_pointer) \
          {

    //stop processing argv
    #define done \
          default: \
            if (*opt_pointer != '\0') \
              goto opt_err_opt; \
            else \
              goto opt_next; \
            break; \
          } \
        opt_next:; \
      }
    #endif //opt.h

    #include <stdio.h>
    #include "opt.h"
    int
    main (int argc, char **argv)
    {
      #define by_character 0
      #define by_word      1
      #define by_line      2
      int cmp = by_character;
      int case_insensitive = 0;
      opt
      case 'h':
        puts ("HELP!");
        break;
      case 'v':
        puts ("fileCMP Version 1.0");
        break;
      case 'i':
        case_insensitive = 1;
        break;
      case 'w':
        cmp = by_word;
        break;
      case 'l':
        cmp = by_line;
        break;
      case '-':required
        printf("first filename: %s\n", optarg);
        break;
      done
      else printf ("Positional Argument %s\n", argv[optind]);
      return 0;
    }
0
ответ дан Anonymous 16 August 2018 в 01:52
поделиться
  • 1
    Вы должны объяснить свой код, а не просто бросать его и ожидать, что все это поймут. Это сайт для обучения, а не просто копирование и вставка. – Yokai 11 April 2017 в 15:25

Насколько мне известно, три наиболее популярных способа анализа аргументов командной строки в C:

  • Getopt (#include <unistd.h> из библиотеки POSIX C), который может решить простой анализ аргументов . Если вы немного знакомы с bash, getopt встроенный bash основан на Getopt из GNU libc.
  • Argp (#include <argp.h> из библиотеки GNU C), который может решить больше сложных задач и позаботится о таких вещах, как, например: -?, --help для справочного сообщения , включая адрес электронной почты -V, --version для информации о версии --usage для сообщения об использовании
  • Выполнение этого самостоятельно, что я не рекомендую для программ, которые будут предоставлены кто-то другой, так как слишком много, что может пойти не так или некачественно. Популярная ошибка забывания о «-», чтобы прекратить парсинг параметров - это всего лишь один пример.

В документации библиотеки GNU C есть несколько хороших примеров для Getopt и Argp.

Пример использования Getopt

#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
    bool isCaseInsensitive = false;
    int opt;
    enum { CHARACTER_MODE, WORD_MODE, LINE_MODE } mode = CHARACTER_MODE;

    while ((opt = getopt(argc, argv, "ilw")) != -1) {
        switch (opt) {
        case 'i': isCaseInsensitive = true; break;
        case 'l': mode = LINE_MODE; break;
        case 'w': mode = WORD_MODE; break;
        default:
            fprintf(stderr, "Usage: %s [-ilw] [file...]\n", argv[0]);
            exit(EXIT_FAILURE);
        }
    }

    // Now optind (declared extern int by <unistd.h>) is the index of the first non-option argument.
    // If it is >= argc, there were no non-option arguments.

    // ...
}

Пример для использования Argp

#include <argp.h>
#include <stdbool.h>

const char *argp_program_version = "programname programversion";
const char *argp_program_bug_address = "<your@email.address>";
static char doc[] = "Your program description.";
static char args_doc[] = "[FILENAME]...";
static struct argp_option options[] = { 
    { "line", 'l', 0, 0, "Compare lines instead of characters."},
    { "word", 'w', 0, 0, "Compare words instead of characters."},
    { "nocase", 'i', 0, 0, "Compare case insensitive instead of case sensitive."},
    { 0 } 
};

struct arguments {
    enum { CHARACTER_MODE, WORD_MODE, LINE_MODE } mode;
    bool isCaseInsensitive;
};

static error_t parse_opt(int key, char *arg, struct argp_state *state) {
    struct arguments *arguments = state->input;
    switch (key) {
    case 'l': arguments->mode = LINE_MODE; break;
    case 'w': arguments->mode = WORD_MODE; break;
    case 'i': arguments->isCaseInsensitive = true; break;
    case ARGP_KEY_ARG: return 0;
    default: return ARGP_ERR_UNKNOWN;
    }   
    return 0;
}

static struct argp argp = { options, parse_opt, args_doc, doc, 0, 0, 0 };

int main(int argc, char *argv[])
{
    struct arguments arguments;

    arguments.mode = CHARACTER_MODE;
    arguments.isCaseInsensitive = false;

    argp_parse(&argp, argc, argv, 0, 0, &arguments);

    // ...
}

Пример для Выполнение себя

#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{   
    bool isCaseInsensitive = false;
    enum { CHARACTER_MODE, WORD_MODE, LINE_MODE } mode = CHARACTER_MODE;
    size_t optind;
    for (optind = 1; optind < argc && argv[optind][0] == '-'; optind++) {
        switch (argv[optind][1]) {
        case 'i': isCaseInsensitive = true; break;
        case 'l': mode = LINE_MODE; break;
        case 'w': mode = WORD_MODE; break;
        default:
            fprintf(stderr, "Usage: %s [-ilw] [file...]\n", argv[0]);
            exit(EXIT_FAILURE);
        }   
    }   

    // *argv points to the remaining non-option arguments.
    // If *argv is NULL, there were no non-option arguments.

    // ...
}   

Отказ от ответственности: я новичок в Argp, пример может содержать ошибки.

128
ответ дан Christian Hujer 16 August 2018 в 01:52
поделиться
  • 1
    На самом деле тщательный ответ, спасибо Кристиан (поддержал). Тем не менее, пользователи Mac должны знать, что подход argp не является межплатформенным. Поскольку я нашел здесь , Argp является нестандартным расширением API glibc. Он доступен в gnulib , поэтому его можно добавить в проект явно. Тем не менее, возможно, для разработчиков только для Mac или кросс-платформенных приложений использовать метод getopt. – thclark 13 December 2016 в 12:06

Docopt имеет реализацию C, которую я считал довольно приятной: https://github.com/docopt/docopt.c

Из стандартного формата в формате man, параметры командной строки, docopt infers и создает парсер аргументов. Это началось в python; версия python буквально просто анализирует docstring и возвращает dict. Для этого в C требуется немного больше работы, но он чист в использовании и не имеет внешних зависимостей.

2
ответ дан gvoysey 16 August 2018 в 01:52
поделиться

Если я могу использовать собственный рожок, я также хотел бы предложить взглянуть на библиотеку разбора параметров, которую я написал: dropt .

  • Это библиотека C (при необходимости, с помощью C ++-оболочки).
  • Легкий.
  • Он расширяемый (типы настраиваемых аргументов могут быть легко добавлены и иметь равную основу со встроенным аргументом типы.)
  • Он должен быть очень портативным (он написан в стандарте C) без зависимостей (кроме стандартной библиотеки C).
  • Он имеет очень неограниченную лицензию (zlib / libpng).

Одна из функций, которую он предлагает, что многие другие не поддерживают переопределение предыдущих параметров. Например, если у вас есть псевдоним оболочки:

alias bar="foo --flag1 --flag2 --flag3"

, и вы хотите использовать bar, но с отключенным --flag1, это позволяет:

bar --flag1=0
0
ответ дан jamesdlin 16 August 2018 в 01:52
поделиться

Учебный шаблон для синтаксического анализа аргументов командной строки в C.

C:> programName -w-fileOne.txt fileTwo.txt

BOOL argLine = FALSE;
BOOL argWord = FALSE;
BOOL argChar = FALSE;
char * fileName1 = NULL;
char * fileName2 = NULL;

int main(int argc, char * argv[]) {
    int i;
    printf("Argument count=%d\n",argc);
    for (i = 0; i < argc; i++) {
        printf("Argument %s\n",argv[i]);
        if (strcmp(argv[i],"-l")==0) {
            argLine = TRUE;
            printf("    argLine=TRUE\n");
        }
        else if (strcmp(argv[i],"-w")==0) {
            argWord = TRUE;
            printf("    argWord=TRUE\n");
        }
        else if (strcmp(argv[i],"-c")==0) {
            argChar = TRUE;
            printf("    argChar=TRUE\n");
        }
        else if (strcmp(argv[i],"--")==0) {
            if (i+1 <= argc) {
                fileName1 = argv[++i];
                printf("    fileName1=%s\n",fileName1);
            }
            if (i+1 <= argc) {
                fileName2 = argv[++i];
                printf("    fileName2=%s\n",fileName2);
            }
        }
    }
    return 0;
}
0
ответ дан Java42 16 August 2018 в 01:52
поделиться
  • 1
    ... Я не думаю, что в C есть логическая переменная ...? – user1251020 10 March 2012 в 03:18
  • 2
    Моя среда eclipse / windows имеет тип BOOL. Просто измените его на тип int или char и соответствующим образом настройте код. – Java42 10 March 2012 в 03:25
  • 3
    C99 имеет тип _Bool все время и заголовок <stdbool.h>, который определяет bool как _Bool и true и false и __bool_true_false_are_defined, все макросы (которые, в исключительных случаях, могут быть неопределенными и переопределяется без вызова неопределенного поведения, однако эта лицензия помечена как «устаревшая»). Итак, если у вас есть компилятор C99, вы можете использовать <stdbool.h> и bool. Если нет, вы либо пишете один для себя (это не сложно), либо вы используете родной эквивалент. – Jonathan Leffler 10 March 2012 в 20:51
  • 4
    @Wolfer В моей среде C есть тип BOOL (как typedef int BOOL) и введите boolean (как typedef unsigned char boolean), и нет определения для типа bool. В этом примере просто измените тип int или char и соответствующим образом настройте код. – Java42 14 October 2013 в 18:44
  • 5
    Я не согласен с этим подходом. Используйте функцию библиотеки для анализа параметров. – Jonathan Leffler 6 July 2014 в 16:05

Используйте getopt() или, возможно, getopt_long() .

int iflag = 0;
enum { WORD_MODE, LINE_MODE } op_mode = WORD_MODE;  // Default set
int opt;

while ((opt = getopt(argc, argv, "ilw") != -1)
{
    switch (opt)
    {
    case 'i':
        iflag = 1;
        break;
    case 'l':
        op_mode = LINE_MODE;
        break;
    case 'w':
        op_mode = WORD_MODE;
        break;
    default:
        fprintf(stderr, "Usage: %s [-ilw] [file ...]\n", argv[0]);
        exit(EXIT_FAILURE);
    }
}

/* Process file names or stdin */
if (optind >= argc)
    process(stdin, "(standard input)", op_mode);
else
{
    int i;
    for (i = optind; i < argc; i++)
    {
        FILE *fp = fopen(argv[i], "r");
        if (fp == 0)
            fprintf(stderr, "%s: failed to open %s (%d %s)\n",
                    argv[0], argv[i], errno, strerror(errno));
        else
        {
            process(fp, argv[i], op_mode);
            fclose(fp);
        }
    }
 }

Обратите внимание, что вам нужно определить, какие заголовки должны включать (I сделайте 4, которые требуются), и способ, которым я написал тип op_mode, означает, что у вас есть проблема в функции process() - вы не можете получить доступ к перечислению там. Лучше всего переместить перечисление вне функции; вы можете даже сделать op_mode переменную с файлом без внешней привязки (причудливый способ сказать static), чтобы избежать передачи ее функции. Этот код не обрабатывает - как синоним стандартного ввода, другое упражнение для читателя. Обратите внимание, что getopt() автоматически выполняет --, чтобы отметить конец опций для вас.

Я не запускал какую-либо версию ввода выше компилятора; в нем могут быть ошибки.


Для дополнительного кредита напишите функцию (библиотека):

int filter(int argc, char **argv, int idx, int (*function)(FILE *fp, const char *fn));

, которая инкапсулирует логику для обработки параметров имени файла после getopt(). Он должен обрабатывать - в качестве стандартного ввода. Обратите внимание, что использование этого будет означать, что op_mode должно быть переменной статического файла. Функция filter() принимает argc, argv, optind и указатель на функцию обработки. Он должен вернуть 0 (EXIT_SUCCESS), если он смог открыть все файлы и все вызовы функции 0, иначе 1 (или EXIT_FAILURE). Наличие такой функции упрощает запись программ «фильтра» в стиле Unix, которые читают файлы, указанные в командной строке или стандартном вводе.

14
ответ дан Jonathan Leffler 16 August 2018 в 01:52
поделиться

Я очень удивлен, что никто не поднял пакет «opt» Джеймса Тейлера.

Вы можете выбрать http://public.lanl.gov/jt/Software/

и лестное сообщение с некоторыми примерами того, как это намного проще, чем другие подходы:

http://www.decompile.com/not_invented_here/ выбрать /

3
ответ дан markgalassi 16 August 2018 в 01:52
поделиться

Я нашел Gengetopt очень полезным - вы указываете параметры, которые хотите с помощью простого файла конфигурации, и генерируете пару .c / .h, которую вы просто включаете и связываете с вашим заявление. Сгенерированный код использует getopt_long, похоже, обрабатывает наиболее распространенные виды параметров командной строки, и это может сэкономить много времени.

Входной файл gengetopt может выглядеть примерно так:

version "0.1"
package "myApp"
purpose "Does something useful."

# Options
option "filename" f "Input filename" string required
option "verbose" v "Increase program verbosity" flag off
option "id" i "Data ID" int required
option "value" r "Data value" multiple(1-) int optional 

Генерация кода проста и выплевывается cmdline.h и cmdline.c:

$ gengetopt --input=myApp.cmdline --include-getopt

Сгенерированный код легко интегрируется:

#include <stdio.h>
#include "cmdline.h"

int main(int argc, char ** argv) {
  struct gengetopt_args_info ai;
  if (cmdline_parser(argc, argv, &ai) != 0) {
    exit(1);
  }
  printf("ai.filename_arg: %s\n", ai.filename_arg);
  printf("ai.verbose_flag: %d\n", ai.verbose_flag);
  printf("ai.id_arg: %d\n", ai.id_arg);
  int i;
  for (i = 0; i < ai.value_given; ++i) {
    printf("ai.value_arg[%d]: %d\n", i, ai.value_arg[i]);
  }
}

Если вы необходимо выполнить какую-либо дополнительную проверку (например, флаги обеспечения взаимно исключают), вы можете сделать это довольно легко с данными, хранящимися в структуре gengetopt_args_info.

8
ответ дан meowsqueak 16 August 2018 в 01:52
поделиться
  • 1
    1 ++, за исключением того, что он генерирует код, который генерирует предупреждения :( – cat 2 October 2016 в 23:06
  • 2
    Да, к сожалению. Я помещал исключения в мой файл cmake. – meowsqueak 3 October 2016 в 09:23
  • 3
    Я, вероятно, просто использую прагмы GCC, чтобы игнорировать предупреждения для этого файла (ужасно, я знаю) – cat 3 October 2016 в 13:06
  • 4
    Обратите внимание, что вы, очевидно, потеряете их, если вы восстановите источник, поэтому вы можете применить их как патч в процессе сборки. Честно говоря, мне было проще просто отключить предупреждения по этим конкретным файлам. – meowsqueak 3 October 2016 в 20:26
  • 5
    ну нет, я имею в виду положить прагмы вокруг #include, а не в сгенерированный файл. мне отключить предупреждения verboten :-) – cat 3 October 2016 в 20:28

Хорошо, это начало длинной истории - сделано короткое «bort parsing командной строки в C ...

/**
* Helper function to parse the command line
* @param argc Argument Counter
* @param argv Argument Vector
* @param prog Program Instance Reference to fill with options
*/
bool parseCommandLine(int argc, char* argv[], DuplicateFileHardLinker* prog) {
  bool pathAdded = false;

  // iterate over all arguments...
  for ( int i = 1; i<argc; i++ ) {

    // is argv a command line option ?
    if ( argv[i][0] == '-' || argv[i][0] == '/' ) {

// ~~~~~~ Optionally Cut that part vvvvvvvvvvvvv for sake of simplicity ~~~~~~~
      // check for longer options
            if ( stricmp( &argv[i][1], "NoFileName"  ) == 0
              ||  strcmp( &argv[i][1], "q1"          ) == 0 ) {

        boNoFileNameLog = true;
      } else if ( strcmp( &argv[i][1], "FuckNow?"    ) == 0 ) {
          logInfo( "SECRET FOUND: Well - wow I'm glad ya ask me.");
      } else {

// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Now here comes the main thing:
//
        // check for one char options
        while ( char option = *++argv[i] ) {

          switch ( option ) {
          case '?':
            // Show program usage

            logInfo(L"Options:");
            logInfo(L"  /q\t>Quite mode");
            logInfo(L"  /v\t>Verbose mode");
            logInfo(L"  /d\t>Debug mode");
            return false;

            // Log options
          case 'q':
            setLogLevel(LOG_ERROR);
            break;

          case 'v':
            setLogLevel(LOG_VERBOSE);
            break;

          case 'd':
            setLogLevel(LOG_DEBUG);
            break;

          default:
            logError(L"'%s' is an illegal command line option!"
                      "  Use /? to see valid options!", option);
            return false;
          } // switch one-char-option
        } //while one-char-options
      }  //else one vs longer options
    } // if isArgAnOption

// 
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^  So that's it! ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// What follows now is are some usefull extras...
//
    else {


      // the command line options seems to be a path...
      WCHAR tmpPath[MAX_PATH_LENGTH];
      mbstowcs(tmpPath, argv[i], sizeof(tmpPath));

      // check if the path is existing!
      //...

      prog->addPath(tmpPath); //Comment or remove to get a working example
      pathAdded = true;
    }
  }

  // check for parameters
  if ( !pathAdded ) {
    logError("You need to specify at least one folder to process!\n"
             "Use /? to see valid options!");
    return false;
  }

  return true;
}



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

  try {
    // parse the command line
    if ( !parseCommandLine(argc, argv, prog) ) {
      return 1; 
    }

// I know that sample is just to show how the nicely parse commandline Arguments
// So Please excuse more nice useful C-glatter that follows now...
  }
  catch ( LPCWSTR err ) {
    DWORD dwError = GetLastError();
    if ( wcslen(err) > 0 ) {
      if ( dwError != 0 ) {
        logError(dwError, err);
      }
      else {
        logError(err);
      }
    }
    return 2;
  }
}

#define LOG_ERROR               1
#define LOG_INFO                0
#define LOG_VERBOSE             -1
#define LOG_DEBUG               -2

/** Logging Level for the console output */
int logLevel = LOG_INFO;

void logError(LPCWSTR message, ...) {
  va_list argp;
  fwprintf(stderr, L"ERROR: ");
  va_start(argp, message);
  vfwprintf(stderr, message, argp);
  va_end(argp);
  fwprintf(stderr, L"\n");
}


void logInfo(LPCWSTR message, ...) {
  if ( logLevel <= LOG_INFO ) {
    va_list argp;
    va_start(argp, message);
    vwprintf(message, argp);
    va_end(argp);
    wprintf(L"\n");
  }
}

Обратите внимание, что эта версия также поддерживает комбинирующие аргументы:« Вместо записи / h / s -> / hs также будет работать.

Извините за то, что вы публиковали n-й человек здесь, однако я не был доволен всеми автономными версиями, которые я видел здесь. Хорошо, что либцы прекрасны. Поэтому, я бы предпочел использовать parseer option libUCW, Arg или Getopt над самодельными.

Обратите внимание, что вы можете изменить:

*++argv[i] -> (++argv*)[0] более длинный, но загадочный, но все же cryptic.

Хорошо, давайте сломаем его: 1. argv [i] -> получить доступ к i-му элементу в поле указателя argv-char

  1. ++ * .. . -> будет перенаправлять argv-указатель на один символ
  2. ... [0] -> будет следовать указателю, прочитав char
  3. ++ (...) ->

Так приятно, что в C ## указатели «умерли» - долго живут указатели !!!

]
0
ответ дан Nadu 16 August 2018 в 01:52
поделиться
#include <stdio.h>

int main(int argc, char **argv)
{
    size_t i;
    size_t filename_i = -1;

    for (i = 0; i < argc; i++)
    {
        char const *option =  argv[i];
        if (option[0] == '-')
        {
            printf("I am a flagged option");
            switch (option[1])
            {
                case 'a':
                    /*someting*/
                    break;
                case 'b':
                    break;
                case '-':
                    /* "--" -- the next argument will be a file.*/
                    filename_i = i;
                    i = i + 1;
                    break;
                default:
                    printf("flag not recognised %s", option);
                    break;
            }
        }
        else
        {   
            printf("I am a positional argument");
        }

        /* At this point, if -- was specified, then filename_i contains the index
         into argv that contains the filename. If -- was not specified, then filename_i will be -1*/
     }
  return 0;
}
0
ответ дан Pod 16 August 2018 в 01:52
поделиться
  • 1
    Нет; абсолютно не лучший способ сделать это ... Используйте одну из функций анализа аргументов - getopt() или getopt_long(). – Jonathan Leffler 10 March 2012 в 02:55
  • 2
    Похоже на обмана, учитывая, что это неторопливо вопрос о домашнем задании. Кроме того, ОП с трудом понимает концепцию того, что такое строка, и как читать ее части. Форест на него - ошибка. – Pod 10 March 2012 в 03:01
  • 3
    Это вопрос домашней работы. Я знаю, что такое строка. Я просто не понимаю, как разбить аргументы командной строки, потому что мне кажется сбивающим с толку, когда вы можете вводить параметры сколько угодно раз, поэтому вы не можете понять, где находятся имена файлов. Может быть, я переусердствую? – user1251020 10 March 2012 в 03:26

Я написал небольшую библиотеку, которая анализирует аргументы, похожие на POpt, с которыми у меня было несколько проблем, называемых XOpt . Использует разбор аргументов в стиле GNU и имеет очень похожий интерфейс с POpt.

Я использую его время от времени с большим успехом, и он работает практически где угодно.

1
ответ дан Qix 16 August 2018 в 01:52
поделиться

Существует большая библиотека C libUCW общего назначения, которая включает в себя опциональный синтаксический анализ параметров командной строки и .

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

Пример анализатора параметров libUCW (от библиотека docs)

#include <ucw/lib.h>
#include <ucw/opt.h>

int english;
int sugar;
int verbose;
char *tea_name;

static struct opt_section options = {
  OPT_ITEMS {
    OPT_HELP("A simple tea boiling console."),
    OPT_HELP("Usage: teapot [options] name-of-the-tea"),
    OPT_HELP(""),
    OPT_HELP("Options:"),
    OPT_HELP_OPTION,
    OPT_BOOL('e', "english-style", english, 0, "\tEnglish style (with milk)"),
    OPT_INT('s', "sugar", sugar, OPT_REQUIRED_VALUE, "<spoons>\tAmount of sugar (in teaspoons)"),
    OPT_INC('v', "verbose", verbose, 0, "\tVerbose (the more -v, the more verbose)"),
    OPT_STRING(OPT_POSITIONAL(1), NULL, tea_name, OPT_REQUIRED, ""),
    OPT_END
  }
};

int main(int argc, char **argv)
{
  opt_parse(&options, argv+1);
  return 0;
}
2
ответ дан Tomáš Gavenčiak 16 August 2018 в 01:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: