2016-12-20 2 views
1

после прочтения известного PDF о argp, я хотел сделать что-то с ним, но у меня возникают проблемы, в этом примере:Как принимать символ или строку в качестве входных данных

static int parse_opt (int key, char *arg, struct argp_state *state) 
{ 
    switch (key) 
    { 
     case 'd': 
     { 
      unsigned int i; 
      for (i = 0; i < atoi (arg); i++) 
       printf ("."); 
      printf ("\n"); 
      break; 
     } 
    } 
    return 0; 
} 

int main (int argc, char **argv) 
{ 
    struct argp_option options[] = 
    { 
     { "dot", 'd', "NUM", 0, "Show some dots on the screen"}, 
     { 0 } 
    }; 
    struct argp argp = { options, parse_opt, 0, 0 }; 
    return argp_parse (&argp, argc, argv, 0, 0, 0); 
} 

-d принимает аргумент типа int, но если я хочу получить массив char или char в качестве аргумента? В pdf-документе не рассматриваются ни документы, ни документы.

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

код, который не работает при сравнении ARG с гольца:

static int parse_opt(int key, char *arg, struct argp_state *state) 
{  
    switch(key) 
    { 
     case 'e': 
     { 
      //Here I want to check if "TOPIC" has something, in this case, a char array 
      //then based on that, do something. 
      if (0 == strcmp(arg, 'e')) 
      { 
       printf("Worked"); 
      } 
     } 
    } 

    return 0; 
}//End of parse_opt 

int main(int argc, char **argv) 
{ 
    struct argp_option options[] = 
    { 
     {"example", 'e', "TOPIC", 0, "Shows examples about a mathematical topic"}, 
     {0} 
    }; 

    struct argp argp = {options, parse_opt}; 

    return argp_parse (&argp, argc, argv, 0, 0, 0); 
}//End of main 

Спасибо заранее.

+0

Ум разъяснении 'Параметр -d принимает аргумент типа Int,'? – sjsam

+2

"-d принимает аргумент типа int". Это не правда. 'arg' всегда является строкой. Это ваш код, который меняет его на 'int'. Если вы хотите сохранить его как строку, просто не называйте 'atoi'. – kaylum

+0

@sjsam Конечно, есть unsigned int, называемый i, который имеет отношение с «NUM» tha является аргументом -d, аргумент «NUM» просто принимает значения целых чисел, и я хочу, чтобы он принимал массив char или char, я надеюсь, что я был понятен –

ответ

1

https://www.gnu.org/software/libc/manual/html_node/Argp.html

#include <stdio.h> 
#include <argp.h> 
#include <string.h> 

static int parse_opt(int key, char *arg, struct argp_state *state) { 
    (void)state; // We don't use state 
    switch (key) { 
    case 'c': { 
    if (strlen(arg) == 1) { // we only want one char 
     char c = *arg;  // or arg[0] 
     printf("my super char %c !!!\n", c); 
    } else { 
     return 1; 
    } 
    } 
    } 
    return 0; 
} 

int main(int argc, char **argv) { 
    struct argp_option const options[] = { 
     {"char", 'c', "c", 0, "a super char", 0}, {0}}; 
    struct argp const argp = {options, &parse_opt, NULL, NULL, NULL, NULL, NULL}; 
    argp_parse(&argp, argc, argv, 0, NULL, NULL); 
} 
+0

Я вроде как его получаю, но вы можете объяснить часть в struct argp, когда он говорит NULL , примеры в документе не показывают ничего подобного или, по крайней мере, в примере, который я вижу. –

+0

Это просто предупреждение avoir, потому что 'struct argp' имеет много полей, [doc] (https://www.gnu.org/software/libc/manual/html_node/Argp-Parsers.html#Argp-Parsers). Чтобы узнать, что такое 'NULL', прочитайте [это] (http://stackoverflow.com/questions/1296843/what-is-the-difference-between-null-0-and-0) – Stargateur

+0

Это сделало работу, спасибо –

Смежные вопросы