Quieres recoger opciones de linea de comandos en tu programa de c?
En la libreria glibc de linux se puede usar la funcion getopt para gestionar de forma correcta los argumentos.
Este es un ejemplo con mucho printf para debug.
/**
* getopt.c
* Pequeño ejemplo de codigo que muestra el uso de la funcion getopt
* Es una funcion util para recoger parametros de programas, que va mas
* alla de recorrer el array de argumentos argv[]
*/
// dentro de la libreria unistd encontramos la funcion getopt
#include <unistd.h>
#include <stdio.h>
// funcion para mostrar un texto de error
void explicacion ( char * argv []);
// funcion principal
int main ( int argc , char * argv []) {
int opcionA = 0 ;
int opcionV = 0 ;
char * parametroC = ' ' ;
int i ;
int opcion ;
opterr = 0 ;
// primero veamos los argumentos "en bruto"
printf ( "
--[Argumentos recibidos]--------------------------------
" );
for ( i = 0 ; i & lt ; argc ; i ++ ) {
printf ( " argumento %d = %s
" , i , argv [ i ]);
}
printf ( "--------------------------------------------------------
" );
// Esta es una forma habitual de recoger argumentos con getopt
// se usa una iteracion y cada elemento se pasa por un switch-case
while (( opcion = getopt ( argc , argv , "avc:" )) != - 1 )
{
switch ( opcion )
{
case 'a' :
opcionA = 1 ;
break ;
case 'v' :
opcionV = 1 ;
break ;
case 'c' :
parametroC = optarg ;
break ;
// en caso de error getopt devuelve el caracter ?
case '?' :
if ( isprint ( optopt ))
fprintf ( stderr , "Opcion desconocida `-%c'.
" , optopt );
else
fprintf ( stderr , "Caracter de opcion desconocido `\x%x'.
" , optopt );
return 1 ;
// en cualquier otro caso lo consideramos error grave y salimos
default:
explicacion ( argv );
exit ( - 1 );
} // case
} // while
printf ( "opcionA = %d, opcionV = %d, parametroC = %s
" , opcionA , opcionV , parametroC );
// Volvemos a ver los argumentos en bruto y ATENCION: getopt nos ha cambiado el orden
// dejando al final los argumentos no reconocidos
printf ( "
--[Argumentos recibidos]--------------------------------
" );
for ( i = 0 ; i & lt ; argc ; i ++ ) {
printf ( " argumento %d = %s
" , i , argv [ i ]);
}
printf ( "--------------------------------------------------------
" );
// Si existe un grupo de opciones no reconocidas las mostramos
// getopt pone un indice donde se inician los argumentos desconocidos: optind
for ( i = optind ; i & lt ; argc ; i ++ ) {
printf ( "Este argumento no se espera %s
" , argv [ i ]);
}
// si este indice devuelto por getopt es menor que argc, debemos mostrar el error.
if ( optind & lt ; argc ) {
explicacion ( argv );
}
return 0 ;
}
// implementacion de la funcion de explicacion.
void explicacion ( char * argv []) {
printf ( "a
La has defecado pero de gordo." );
printf ( "El uso correcto es:
%s" , argv [ 0 ]);
printf ( " -a -v -c <valor>
" );
}