Lihuen
RSSRSS AtomAtom

Diferencia entre revisiones de «Parsear argumentos en forma elegante con getopt()»

(Nueva página: Esta es una buena idea para deshacerse de los problemas de parcear los argumentos pasados al main, usando getopt_long() Esta un poco más claro que en el ejemplo de las paginas del ma...)
 
 
(No se muestran 6 ediciones intermedias de 2 usuarios)
Línea 1: Línea 1:
Esta es una buena idea para deshacerse de los problemas de parcear los argumentos pasados al main, usando getopt_long()
+
Esta es una buena idea para deshacerse de los problemas de parsear los argumentos pasados al main, usando getopt_long().
Esta un poco más claro que en el ejemplo de las paginas del manual y comentado parte por parte
+
Está un poco más claro que en el ejemplo de las páginas del manual y comentado parte por parte.
  
#include <stdio.h> /* para printf */
+
<source lang=c>
#include <stdlib.h> /* para exit */
+
#include <stdio.h> /* para printf */
#define _GNU_SOURCE
+
#include <stdlib.h> /* para exit */
#include <getopt.h> /*para getopt_long*/
+
#define _GNU_SOURCE
 
+
#include <getopt.h> /*para getopt_long*/  
int main(int argc, char * argv[]){
+
int c;
+
int main(int argc, char * argv[]){
int digit_optind = 0;
+
    int c;
 
+
    int digit_optind = 0;
while (1) {
+
/*Este while parcea todos los argumentos de argv con la funcion getopt_long()*/
+
    while (1) {
int this_option_optind = optind ? optind : 1;
+
        /*Este while parsea todos los argumentos de argv con la función getopt_long()*/
int option_index = 0;
+
        int this_option_optind = optind ? optind : 1;
/*Esta estructura sirve para convertir los argumentos largos en cortos
+
        int option_index = 0;
así, si el argumento es --compress en c se guardara 'c', como c tiene
+
        /*Esta estructura sirve para convertir los argumentos largos en cortos
un argumento opcional, si este existe se guarda en optarg.
+
        así, si el argumento es --compress en c se guardará 'c', como c tiene
no_argument, optional_argument y required_argument son macros que se
+
        un argumento opcional, si éste existe se guarda en optarg.
expanden a 0, 1 y 2 respectivamente*/
+
        no_argument, optional_argument y required_argument son macros que se
static struct option long_options[] = {
+
        expanden a 0, 1 y 2 respectivamente*/
{"compress", optional_argument, 0, 'c'},
+
        static struct option long_options[] = {
{"decompress", no_argument, 0, 'd'},
+
            {"compress", optional_argument, 0, 'c'},
{"help", no_argument, 0, 'h'},
+
            {"decompress", no_argument, 0, 'd'},
{"verbose", no_argument, 0, 'v'},
+
            {"help", no_argument, 0, 'h'},
{"file", required_argument, 0, 'f'},
+
            {"verbose", no_argument, 0, 'v'},
{0, 0, 0, 0}
+
            {"file", required_argument, 0, 'f'},
};
+
            {0, 0, 0, 0}
/*La cadena "dhvf:c::" indica que d, h y v no tienen argumentos, f tiene un
+
        };
argumento requerido (por eso los dos puntos 'f:') y c tiene un argumento opcional
+
        /*La cadena "dhvf:c::" indica que d, h y v no tienen argumentos, f tiene un
(de ahi los dobles dos puntos 'c::')*/
+
        argumento requerido (por eso los dos puntos 'f:') y c tiene un argumento opcional
c = getopt_long (argc, argv, "dhvf:c::",
+
        (de ahi los dobles dos puntos 'c::')*/
long_options, &option_index);
+
        c = getopt_long (argc, argv, "dhvf:c::",
if (c == -1)
+
        long_options, &option_index);
/*c es -1 cuando se terminan todos los argumentos, entonces sale del while*/
+
        if (c == -1)
break;
+
        /*c es -1 cuando se terminan todos los argumentos, entonces sale del while*/
 
+
        break;  
switch (c) {
+
case 'c':
+
        switch (c) {  
/*Si uno de los argumentos de main es --compress=LZW o -cLZW entra en este case
+
            case 'c':
c vale 'c' y optarg vale "LZW"*/
+
                /*Si uno de los argumentos de main es --compress=LZW o -cLZW entra en este case
printf ("option c");
+
                c vale 'c' y optarg vale "LZW"*/
if (0 != optarg)
+
                printf ("option c");
printf(" con argumento %s", optarg);
+
                if (0 != optarg)
printf("\n");
+
                printf(" con argumento %s", optarg);
break;
+
                printf("\n");
 
+
                break;  
case 'd':
+
/*Si uno de los argumentos de main es --decompress o -d entra en este case*/
+
            case 'd':  
printf ("option d\n");
+
                /*Si uno de los argumentos de main es --decompress o -d entra en este case*/
break;
+
                printf ("option d\n");
 
+
                break;
case 'h':
+
/*y asi siguiendo..*/
+
            case 'h':
printf ("option h\n");
+
                /*y asi siguiendo..*/
break;
+
                printf ("option h\n");
 
+
                break;
case 'v':
+
printf ("option v\n");
+
            case 'v':
break;
+
                printf ("option v\n");
 
+
                break;
case 'f':
+
   
printf ("option f con argumento %s\n", optarg);
+
            case 'f':
break;
+
                printf ("option f con argumento %s\n", optarg);
 
+
                break;
default:
+
/*Si el argumento no machea con ninguna opción conocida, debería ser un error en los
+
            default:
parámetros...*/
+
                /*Si el argumento no machea con ninguna opción conocida, debería ser un error en los
printf ("La función getopt_long ha retornado un carácter desconocido. El carácter es = %c\n", c);
+
                parámetros...*/
}
+
                printf ("La función getopt_long ha retornado un carácter desconocido. El carácter es = %c\n", c);
}
+
            }
/*Si siguen apareciendo cosas que no son argumentos, se imprimen hasta que se acaben...*/
+
        }
if (optind < argc) {
+
        /*Si siguen apareciendo cosas que no son argumentos, se imprimen hasta que se acaben...*/
printf ("No son opciones pero estan en ARGV: ");
+
        if (optind < argc) {
while (optind < argc)
+
        printf ("No son opciones pero estan en ARGV: ");
printf ("%s ", argv[optind++]);
+
        while (optind < argc)
printf ("\n");
+
            printf ("%s ", argv[optind++]);
}
+
        printf ("\n");
exit(0);
+
      }
}
+
    exit(0);
 +
}
 +
</source>
 +
[[Category:Cátedras]]

Última revisión de 19:34 1 may 2008

Esta es una buena idea para deshacerse de los problemas de parsear los argumentos pasados al main, usando getopt_long(). Está un poco más claro que en el ejemplo de las páginas del manual y comentado parte por parte.

 #include <stdio.h> /* para printf */
 #include <stdlib.h> /* para exit */
 #define _GNU_SOURCE
 #include <getopt.h> /*para getopt_long*/ 
 
 int main(int argc, char * argv[]){
     int c;
     int digit_optind = 0;
 
     while (1) {
         /*Este while parsea todos los argumentos de argv con la función getopt_long()*/
         int this_option_optind = optind ? optind : 1;
         int option_index = 0;
         /*Esta estructura sirve para convertir los argumentos largos en cortos
         así, si el argumento es --compress en c se guardará 'c', como c tiene
         un argumento opcional, si éste existe se guarda en optarg.
         no_argument, optional_argument y required_argument son macros que se
         expanden a 0, 1 y 2 respectivamente*/
         static struct option long_options[] = {
             {"compress", optional_argument, 0, 'c'},
             {"decompress", no_argument, 0, 'd'},
             {"help", no_argument, 0, 'h'},
             {"verbose", no_argument, 0, 'v'},
             {"file", required_argument, 0, 'f'},
             {0, 0, 0, 0}
         };
        /*La cadena "dhvf:c::" indica que d, h y v no tienen argumentos, f tiene un
        argumento requerido (por eso los dos puntos 'f:') y c tiene un argumento opcional
        (de ahi los dobles dos puntos 'c::')*/
         c = getopt_long (argc, argv, "dhvf:c::",
         long_options, &option_index);
         if (c == -1)
         /*c es -1 cuando se terminan todos los argumentos, entonces sale del while*/
         break; 
 
         switch (c) { 
             case 'c':
                 /*Si uno de los argumentos de main es --compress=LZW o -cLZW entra en este case
                 c vale 'c' y optarg vale "LZW"*/
                 printf ("option c");
                 if (0 != optarg)
                 printf(" con argumento %s", optarg);
                 printf("\n");
                 break; 
 
             case 'd': 
                 /*Si uno de los argumentos de main es --decompress o -d entra en este case*/
                 printf ("option d\n");
                 break;
 
             case 'h':
                 /*y asi siguiendo..*/
                 printf ("option h\n");
                 break;
 
             case 'v':
                 printf ("option v\n");
                 break;
 
             case 'f':
                 printf ("option f con argumento %s\n", optarg);
                 break;
 
             default:
                 /*Si el argumento no machea con ninguna opción conocida, debería ser un error en los
                 parámetros...*/
                 printf ("La función getopt_long ha retornado un carácter desconocido. El carácter es = %c\n", c);
             }
         }
         /*Si siguen apareciendo cosas que no son argumentos, se imprimen hasta que se acaben...*/
         if (optind < argc) {
         printf ("No son opciones pero estan en ARGV: ");
         while (optind < argc)
             printf ("%s ", argv[optind++]);
         printf ("\n");
      }
    exit(0);
 }