getopt
Análisis estándar de opciones
getopt es una lección gratuita de C Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de C Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de C Academy incluye 4 lecciones en total.
¿Qué es getopt?
getopt es una función POSIX que analiza por usted las opciones de un solo carácter, siguiendo las convenciones estándar de Unix.
Se encuentra en <unistd.h> y elimina la mayor parte del código repetitivo del análisis manual de flags.
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
int opt;
while ((opt = getopt(argc, argv, "v")) != -1) {
if (opt == 'v') printf("verbose on\n");
}
return 0;
}La cadena de opciones
El tercer argumento de getopt es la optstring: una lista de letras de opción válidas.
"abc" significa que se aceptan -a, -b y -c como flags booleanos.
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
int opt;
while ((opt = getopt(argc, argv, "abc")) != -1) {
printf("saw option -%c\n", opt);
}
return 0;
}El bucle de análisis
getopt devuelve el carácter de la siguiente opción en cada llamada, o -1 cuando termina.
El patrón estándar es un bucle while con un switch dentro para decidir según el carácter devuelto.
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
int opt;
while ((opt = getopt(argc, argv, "xy")) != -1) {
switch (opt) {
case 'x': printf("x set\n"); break;
case 'y': printf("y set\n"); break;
}
}
return 0;
}Opciones con argumentos
Coloque dos puntos después de una letra en la optstring para indicar que recibe un valor. "o:" significa que -o requiere un argumento.
El valor queda disponible en la variable global optarg.
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
int opt;
while ((opt = getopt(argc, argv, "o:")) != -1) {
if (opt == 'o') printf("output = %s\n", optarg);
}
return 0;
}Combinar flags y opciones con valores
Puede combinar opciones booleanas y opciones que reciben valores en una sola optstring. Aquí -v es un flag y -n recibe un número.
getopt también permite agrupar flags, como -vn 5.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
int opt, verbose = 0, n = 0;
while ((opt = getopt(argc, argv, "vn:")) != -1) {
if (opt == 'v') verbose = 1;
else if (opt == 'n') n = atoi(optarg);
}
printf("verbose=%d n=%d\n", verbose, n);
return 0;
}Gestionar opciones desconocidas
Cuando getopt encuentra una opción que no está en la optstring, devuelve '?' e imprime un error (a menos que lo silencie).
Añada un case '?' para gestionar las entradas incorrectas correctamente.
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
int opt;
while ((opt = getopt(argc, argv, "a")) != -1) {
switch (opt) {
case 'a': printf("a\n"); break;
case '?': printf("unknown option\n"); break;
}
}
return 0;
}Argumentos obligatorios ausentes
Si se proporciona una opción que recibe un valor sin incluir dicho valor, el comportamiento de getopt depende de la optstring.
Si comienza la optstring con dos puntos (":o:"), getopt devuelve ':' cuando falta un argumento, de modo que puede informarlo con precisión.
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
int opt;
while ((opt = getopt(argc, argv, ":f:")) != -1) {
if (opt == 'f') printf("file=%s\n", optarg);
else if (opt == ':') printf("option needs a value\n");
}
return 0;
}optind: dónde se detuvo el análisis
Después del bucle, la variable global optind contiene el índice en argv del primer argumento no opcional.
Úsela para procesar los argumentos posicionales restantes, como nombres de archivo.
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
int opt;
while ((opt = getopt(argc, argv, "v")) != -1) { }
for (int i = optind; i < argc; i++)
printf("positional: %s\n", argv[i]);
return 0;
}Silenciar los mensajes de getopt
De forma predeterminada, getopt imprime sus propios mensajes de error en stderr. Establezca la variable global opterr en 0 para suprimirlos y gestionar los errores por su cuenta.
#include <stdio.h>
#include <unistd.h>
extern int opterr;
int main(int argc, char *argv[]) {
opterr = 0;
int opt;
while ((opt = getopt(argc, argv, "a")) != -1) {
if (opt == '?') printf("bad option, handled quietly\n");
}
return 0;
}Identificar la opción incorrecta
Cuando getopt devuelve '?', la variable global optopt contiene el carácter de la opción problemática.
Esto permite imprimir un mensaje útil que indique exactamente qué flag era incorrecto.
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
int opt;
while ((opt = getopt(argc, argv, "a")) != -1) {
if (opt == '?')
printf("Unrecognized option: -%c\n", optopt);
}
return 0;
}Nota sobre las opciones largas
El getopt simple solo admite opciones de una letra. Para opciones largas como --verbose, los sistemas GNU proporcionan getopt_long en <getopt.h>.
Utiliza el mismo bucle, pero añade una tabla de descriptores de opciones largas.
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
printf("getopt parses %d short options\n", argc > 1 ? argc - 1 : 0);
return 0;
}Comprobación rápida
Compruebe su comprensión de la sintaxis de optstring de getopt.
Resumen
Ha aprendido a analizar opciones de forma estándar con getopt:
- Recorra el bucle mientras
getopt(argc, argv, optstring)no sea-1y decida con unswitch. - Dos puntos después de una letra indican que recibe un valor, que se encuentra en
optarg. optindapunta al primer argumento posicional restante.- Las variables globales
opterr,optopty los dos puntos iniciales controlan la gestión de errores.
Preguntas frecuentes
¿La lección «getopt» es gratis?
Sí — el texto completo de «getopt» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de C Academy, actualiza a CoddyKit PRO. El curso de C Academy incluye 4 lecciones en total.
¿Qué aprenderé en «getopt»?
Análisis estándar de opciones Practicas C Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar C Academy?
No se requiere experiencia previa. C Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.
¿Cuánto tiempo toma la lección «getopt»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de C Academy?
Sí. Cada lección de C Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.