Existen unas funciones muy útiles para "filtrar" los argumentos en la linea de ordenes pasados a un programa en C al estilo Unix, esto es:
nombre_programa -o archivo.txt -d 40....
Cuando tenemos el código de nuestro programa, los argumentos son pasados a la funcion main() en dos variables llamadas argc(entero) y argv(array de punteros a cadenas de caracteres, es decir **), siendo argv[0], el primer argumento pasado, argv[1] el segundo, y asi sucesivamente hasta alcanzar argc argumentos.
Tenemos las funciones getopt y getopt_long que nos permiten "parsear" o analizar sintácticamente los argumentos que le pasemos. A estas funciones se les pasa directamente argc y argv, además de una cadena en la que se indican los caracteres de opción a contemplar y si llevan o no un parámetro asociado a continuación. Las funciones devuelven el carácter opción leído o -1 en caso de haber alcanzado el final.
Con esto podemos extraer las opciones que nos han pasado como argumentos independientemente del orden, ya que llamaremos a la función en cuestión (getop o getopt_long)hasta alcanzar el final, indicando en cada ejecución todas las opciones.
1 ejemplo:
int main(int argc,char **argv)
{
int c;
while((c=getopt(argc,argv,"p:n:b:t:d:m:")) != -1){
switch (c) {
case 'p':
//Código asociado a la ipción -p.
break;
case 'n':
//Código asociado a la ipción -n.
break;
case 'b':
//Código asociado a la ipción -b.
.
.
.
default:
printf("Uso: app_spi_slave [-p X][-n X][-b X][-t X][-d X]");
return 1;
}
}
return 0;
}
Como podemos ver, el tercer argumento de getopt es una cadena con los caracteres asociados a cada opción, seguida del carácter ":" que indica que después de dicha opción viene un argumento. Si no hay argumento asociado, basta con no poner el carácter ":".
Para usar el valor pasado a la opción, tenemos la variable optarg, que contiene el argumento de la opción que está siendo analizada. Ésta variable es una cadena de caracteres, por lo que habrá que convertirla al formato que necesite (si es un numero podremos usar al función atoi()).
Como podemos ver en el ejemplo, la función itera una vez en la lista de argumentos, quedándose preparada para acceder a la siguiente cuando la volvamos a ejecutar.
Hemos utilizado la función getopt, pero ¿que hay de getopt_long?
Pues esta segunda función nos permite hacer lo mismo, salvo que tiene dos argumentos mas, uno de ellos es un array de estructuras de tipo struct opts (definida en getopt.h) en las que se asocia un nombre largo a cada opción para poder hacer algo como lo siguiente:
nombre_programa --polarity 1 --outpu nombre_arcivo.txt ....
Para mas información se recomienda acudir a las paginas man para getopt ejecutando:
man 3 getopt
No hay comentarios:
Publicar un comentario