Getopt argumentos opcionales?

Tengo un progtwig en el que ingresa una opción -d y luego si proporciona un argumento no opcional después de la opción, haga algo.
Aquí está mi código:

 #include  #include  #include  #define OPT_LIST "d::" int main (int argc, char *argv[]) { int c; char string[] = "blah"; while ((c = getopt (argc, argv, OPT_LIST)) != -1) { switch (c) { case 'd': printf("%s\n", optarg); break; case '?': fprintf(stderr, "invalid option\n"); exit(EXIT_FAILURE); } } } 

Por lo tanto, si ingresa un argumento no opcional después de la opción, imprime el argumento. Pero quiero que imprima la “cadena” de caracteres si el usuario no proporciona un argumento no opcional (por eso puse la doble coma en la OPT_LIST). Pero no estoy seguro de cómo hacer esto, así que cualquier ayuda sería muy apreciada.

Aquí está lo que pasa cuando ejecuto el progtwig:

 user:desktop shaun$ ./arg -d hello hello user:desktop shaun$ ./arg -d ./arg: option requires an argument -- d invalid option 

Estoy ejecutando una Mac con OS X usando lenguaje C.

La función “valor opcional de una opción” es solo una extensión de libc de GNU, no es requerida por POSIX, y es probable que simplemente no esté implementada por la libc que viene con Mac OS X.

El argumento de las opciones es una cadena que especifica los caracteres de las opciones que son válidos para este progtwig. Un carácter de opción en esta cadena puede ir seguido de dos puntos (‘:’) para indicar que toma un argumento requerido. Si a un carácter de opción le siguen dos puntos (‘::’), su argumento es opcional; Esta es una extensión de GNU.

https://www.gnu.org/software/libc/manual/html_node/Using-Getopt.html

De hecho, POSIX.1-2008, sección 12.2, “Pautas de syntax de utilidad”, prohíbe explícitamente esta función:

Pauta 7: los argumentos opcionales no deben ser opcionales.

http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html#tag_12_02

De acuerdo con la documentación de getopt , se devolverá : si una opción con un argumento no tiene uno. También establece optopt con el argumento correspondiente.

Por lo tanto, utilice:

 int main (int argc, char *argv[]) { int c; while ((c = getopt (argc, argv, "d:f:")) != -1) { switch (c) { case 'd': case 'f': printf("option -%c with argument '%s'\n", c, optarg); break; case ':': switch (optopt) { case 'd': printf("option -%c with default argument value\n", optopt); break; default: fprintf(stderr, "option -%c is missing a required argument\n", optopt); return EXIT_FAILURE; } break; case '?': fprintf(stderr, "invalid option: -%c\n", optopt); return EXIT_FAILURE; } } return EXIT_SUCCESS; } 

Tal vez estoy malinterpretando la pregunta. Lo estoy leyendo como si el usuario quisiera pasar por alto el manejo de errores predeterminado de getopt. Si ese es el caso, ¿no debería haber un: al comienzo de su OPT_LIST? Creo que el código anterior es bueno, sin embargo, creo que todavía se imprimirá

 ./arg: option requires an argument -- d 

Para suprimir eso, ¿no necesitamos una: al comienzo de la OPT_LIST? Por ejemplo, cambiando esto:

 while ((c = getopt (argc, argv, "d:f:")) != -1) 

a esto:

 while ((c = getopt (argc, argv, ":d:f:")) != -1) 

Corrígeme si me equivoco.

Prueba esta solución. Esto funciona para mi. Considere la opción ‘z’ como opción con argumento opcional.

 int c; opterr = 0; //if (opterr != 0) (which it is by default), getopt() prints its own error messages for invalid options and for missing option arguments. while ((c = getopt (argc, argv, "x:y:z:")) != -1) switch (c) { case 'x': case 'y': case 'z': printf("OK ... option -%c with argument '%s'\n", c, optarg); break; case '?': if (optopt == 'x' || optopt == 'y') fprintf (stderr, "ERR ... Option -%c requires an argument.\n", optopt); else if(optopt == 'z' && isprint(optopt)) { printf("OK ... option '-z' without argument \n"); break; } else if (isprint (optopt)) fprintf (stderr, "ERR ... Unknown option `-%c'.\n", optopt); else fprintf (stderr, "ERR ... Unknown option character `\\x%x'.\n", optopt); return -1; default: ; } 

Aquí hay unos ejemplos:

 ./prog -x ERR ... Option -x requires an argument. ./prog -y ERR ... Option -x requires an argument. ./prog -z OK ... option '-z' without argument ./prog -x aaa OK ... option -x with argument 'aaa' ./prog -y bbb -x aaa OK ... option -y with argument 'bbb' OK ... option -x with argument 'aaa' ./prog -x aaa -y bbb -z OK ... option -x with argument 'aaa' OK ... option -y with argument 'bbb' OK ... option '-z' without argument ./prog -x aaa -y bbb -z ccc OK ... option -x with argument 'aaa' OK ... option -y with argument 'bbb' OK ... option -z with argument 'ccc'